/*=========================================================================
                                                                                
Copyright (c) 2007, Los Alamos National Security, LLC

All rights reserved.

Copyright 2007. Los Alamos National Security, LLC. 
This software was produced under U.S. Government contract DE-AC52-06NA25396 
for Los Alamos National Laboratory (LANL), which is operated by 
Los Alamos National Security, LLC for the U.S. Department of Energy. 
The U.S. Government has rights to use, reproduce, and distribute this software. 
NEITHER THE GOVERNMENT NOR LOS ALAMOS NATIONAL SECURITY, LLC MAKES ANY WARRANTY,
EXPRESS OR IMPLIED, OR ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE.  
If software is modified to produce derivative works, such modified software 
should be clearly marked, so as not to confuse it with the version available 
from LANL.
 
Additionally, redistribution and use in source and binary forms, with or 
without modification, are permitted provided that the following conditions 
are met:
-   Redistributions of source code must retain the above copyright notice, 
    this list of conditions and the following disclaimer. 
-   Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution. 
-   Neither the name of Los Alamos National Security, LLC, Los Alamos National
    Laboratory, LANL, the U.S. Government, nor the names of its contributors
    may be used to endorse or promote products derived from this software 
    without specific prior written permission. 

THIS SOFTWARE IS PROVIDED BY LOS ALAMOS NATIONAL SECURITY, LLC AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
ARE DISCLAIMED. IN NO EVENT SHALL LOS ALAMOS NATIONAL SECURITY, LLC OR 
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                                                                                
=========================================================================*/

// .NAME Message - create, send and receive MPI messages
//
// .SECTION Description
// Message class packs and unpacks data into an MPI buffer

#ifndef MESSAGE_H
#define MESSAGE_H

#ifdef USE_VTK_COSMO
#include "CosmoDefinition.h"
#include "vtkstd/queue"

using namespace vtkstd;
#else
#include "Definition.h"
#include <queue>

using namespace std;
#endif


class Message {
public:
  Message(int size = BUF_SZ);

   ~Message();

  // Put values into the MPI buffer
  void putValueAtPosition(int* data, int pos, int count = 1);
  void putValue(int* data, int count = 1);
  void putValue(unsigned short* data, int count = 1);
  void putValue(long int* data, int count = 1);
  void putValue(long long* data, int count = 1);
  void putValue(float* data, int count = 1);
  void putValue(double* data, int count = 1);
  void putValue(char* data, int count = 1);

  // Get values from the MPI buffer
  void getValue(int* data, int count = 1);
  void getValue(unsigned short* data, int count = 1);
  void getValue(long int* data, int count = 1);
  void getValue(long long* data, int count = 1);
  void getValue(float* data, int count = 1);
  void getValue(double* data, int count = 1);
  void getValue(char* data, int count = 1);

  int getBufPos() { return this->bufPos; }

  void manualPackAtPosition(char* data, int pos, int count, size_t size);
  void manualPack(char* data, int count, size_t size);
  void manualUnpack(char* data, int count, size_t size);

  // Send nonblocking
  void send(
        int mach,                       // Where to send message
        int tag = 0                     // Identifying tag
  );

  // Receive blocking
  void receive(
#ifdef USE_SERIAL_COSMO
        int mach = 0,
#else
        int mach = MPI_ANY_SOURCE,      // From where to receive
#endif
        int tag = 0                     // Identifying tag
  );

#ifdef USE_SERIAL_COSMO // message queue hack for serial
  queue<char*> q;
#endif

  // Reset the buffer for another set of data
  void reset();

private:
  char* buffer;         // Buffer to pack
  int   bufSize;        // Size of buffer
  int   bufPos;         // Position in buffer
};

#endif
