![]()
|
mstate.h00001 //
00002 // mstate.h
00003 //
00004 // Copyright (C) 1996 Limit Point Systems, Inc.
00005 //
00006 // Author: Curtis Janssen <cljanss@limitpt.com>
00007 // Maintainer: LPS
00008 //
00009 // This file is part of the SC Toolkit.
00010 //
00011 // The SC Toolkit is free software; you can redistribute it and/or modify
00012 // it under the terms of the GNU Library General Public License as published by
00013 // the Free Software Foundation; either version 2, or (at your option)
00014 // any later version.
00015 //
00016 // The SC Toolkit is distributed in the hope that it will be useful,
00017 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00019 // GNU Library General Public License for more details.
00020 //
00021 // You should have received a copy of the GNU Library General Public License
00022 // along with the SC Toolkit; see the file COPYING.LIB. If not, write to
00023 // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
00024 //
00025 // The U.S. Government is granted a limited license as per AL 91-7.
00026 //
00027
00028 #ifdef __GNUC__
00029 #pragma interface
00030 #endif
00031
00032 #ifndef _util_group_mstate_h
00033 #define _util_group_mstate_h
00034
00035 #include <util/state/state.h>
00036 #include <util/state/statein.h>
00037 #include <util/state/stateout.h>
00038 #include <util/group/message.h>
00039
00040 namespace sc {
00041
00045 class MsgStateSend: public StateOut {
00046 private:
00047 // do not allow copy constructor or assignment
00048 MsgStateSend(const MsgStateSend&);
00049 void operator=(const MsgStateSend&);
00050 protected:
00051 Ref<MessageGrp> grp;
00052 int nbuf; // the number of bytes used in the buffer
00053 int bufsize; // the allocated size of the data buffer
00054 char* buffer; // the data buffer
00055 char* send_buffer; // the buffer used to send data (includes nbuf)
00056 int nheader; // nbuf + nheader = the number of bytes in send_buffer to send
00057 int* nbuf_buffer; // the pointer to the nbuf stored in the buffer
00058
00059 int put_array_void(const void*, int);
00060 public:
00061 MsgStateSend(const Ref<MessageGrp>&);
00062 virtual ~MsgStateSend();
00063
00065 virtual void flush() = 0;
00066
00069 void set_buffer_size(int);
00070
00073 int put(const ClassDesc*);
00074 int put(char r);
00075 int put(unsigned int r);
00076 int put(int r);
00077 int put(float r);
00078 int put(double r);
00079 int put(const char*,int);
00080 int put(const int*,int);
00081 int put(const unsigned int*,int);
00082 int put(const float*,int);
00083 int put(const double*,int);
00084 };
00085
00089 class MsgStateBufRecv: public StateIn {
00090 private:
00091 // do not allow copy constructor or assignment
00092 MsgStateBufRecv(const MsgStateBufRecv&);
00093 void operator=(const MsgStateBufRecv&);
00094 protected:
00095 Ref<MessageGrp> grp;
00096 int nbuf; // the number of bytes used in the buffer
00097 int ibuf; // the current pointer withing the buffer
00098 int bufsize; // the allocated size of the buffer
00099 char* buffer; // the data buffer
00100 char* send_buffer; // the buffer used to send data (includes nbuf)
00101 int nheader; // nbuf + nheader = the number of bytes in send_buffer to send
00102 int* nbuf_buffer; // the pointer to the nbuf stored in the buffer
00103
00104 int get_array_void(void*,int);
00105
00107 virtual void next_buffer() = 0;
00108 public:
00110 MsgStateBufRecv(const Ref<MessageGrp>&);
00112 MsgStateBufRecv();
00113
00114 virtual ~MsgStateBufRecv();
00115
00118 void set_buffer_size(int);
00119 };
00120
00123 class MsgStateRecv: public MsgStateBufRecv {
00124 private:
00125 // do not allow copy constructor or assignment
00126 MsgStateRecv(const MsgStateRecv&);
00127 void operator=(const MsgStateRecv&);
00128 public:
00130 MsgStateRecv(const Ref<MessageGrp>&);
00131
00132 virtual ~MsgStateRecv();
00133
00137 int version(const ClassDesc*);
00138
00141 int get(const ClassDesc**);
00142 int get(char&r, const char *key = 0);
00143 int get(unsigned int&r, const char *key = 0);
00144 int get(int&r, const char *key = 0);
00145 int get(float&r, const char *key = 0);
00146 int get(double&r, const char *key = 0);
00147 int get(char*&);
00148 int get(unsigned int*&);
00149 int get(int*&);
00150 int get(float*&);
00151 int get(double*&);
00152 };
00153
00157 class StateSend: public MsgStateSend {
00158 private:
00159 // do not allow copy constructor or assignment
00160 StateSend(const StateSend&);
00161 void operator=(const StateSend&);
00162 private:
00163 int target_;
00164 public:
00166 StateSend(const Ref<MessageGrp>&);
00167
00168 ~StateSend();
00170 void target(int);
00172 void flush();
00173 };
00174
00178 class StateRecv: public MsgStateRecv {
00179 private:
00180 // do not allow copy constructor or assignment
00181 StateRecv(const StateRecv&);
00182 void operator=(const StateRecv&);
00183 private:
00184 int source_;
00185 protected:
00186 void next_buffer();
00187 public:
00189 StateRecv(const Ref<MessageGrp>&);
00191 void source(int);
00192 };
00193
00197 class BcastStateSend: public MsgStateSend {
00198 private:
00199 // do not allow copy constructor or assignment
00200 BcastStateSend(const BcastStateSend&);
00201 void operator=(const BcastStateSend&);
00202 public:
00204 BcastStateSend(const Ref<MessageGrp>&);
00205
00206 ~BcastStateSend();
00208 void flush();
00209 };
00210
00214 class BcastStateRecv: public MsgStateRecv {
00215 private:
00216 // do not allow copy constructor or assignment
00217 BcastStateRecv(const BcastStateRecv&);
00218 void operator=(const BcastStateRecv&);
00219 protected:
00220 int source_;
00221 void next_buffer();
00222 public:
00224 BcastStateRecv(const Ref<MessageGrp>&, int source = 0);
00226 void source(int s);
00227 };
00228
00232 class BcastState {
00233 private:
00234 BcastStateRecv *recv_;
00235 BcastStateSend *send_;
00236 public:
00238 BcastState(const Ref<MessageGrp> &, int source = 0);
00239
00240 ~BcastState();
00241
00245 void bcast(int &);
00246 void bcast(double &);
00247 void bcast(int *&, int);
00248 void bcast(double *&, int);
00249 template <class T> void bcast(Ref<T>&a)
00250 {
00251 if (recv_) {
00252 a << SavableState::restore_state(*recv_);
00253 }
00254 else if (send_) {
00255 SavableState::save_state(a.pointer(),*send_);
00256 }
00257 }
00258
00261 void flush();
00262
00265 void forget_references();
00266
00268 void set_buffer_size(int);
00269 };
00270
00274 class BcastStateInBin: public MsgStateBufRecv {
00275 private:
00276 // do not allow copy constructor or assignment
00277 BcastStateInBin(const BcastStateRecv&);
00278 void operator=(const BcastStateRecv&);
00279 protected:
00280 int opened_;
00281 int file_position_;
00282 std::streambuf *buf_;
00283
00284 void next_buffer();
00285 int get_array_void(void*, int);
00286 public:
00288 BcastStateInBin(const Ref<KeyVal> &);
00290 BcastStateInBin(const Ref<MessageGrp>&, const char *filename);
00291
00292 ~BcastStateInBin();
00293
00294 virtual int open(const char *name);
00295 virtual void close();
00296
00297 void seek(int loc);
00298 int seekable();
00299 int tell();
00300 int use_directory();
00301 };
00302
00303 }
00304
00305 #endif
00306
00307 // Local Variables:
00308 // mode: c++
00309 // c-file-style: "CLJ"
00310 // End:
Generated at Fri Jan 10 08:14:09 2003 for MPQC 2.1.3 using the documentation package Doxygen 1.2.14. |