/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.horn.distbelief;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.io.Writable;

/**
 * Message wrapper for a propagating message
 */
public class PropMessage<M extends Writable, W extends Writable> implements
    Writable {

  M message;
  W weight;

  public PropMessage(M message, W weight) {
    this.message = message;
    this.weight = weight;
  }

  /**
   * @return the activation or error message
   */
  public M getMessage() {
    return message;
  }

  public W getWeight() {
    return weight;
  }

  @Override
  public void readFields(DataInput in) throws IOException {
    message.readFields(in);
    weight.readFields(in);
  }

  @Override
  public void write(DataOutput out) throws IOException {
    message.write(out);
    weight.write(out);
  }

}
