00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef _util_state_stateout_h
00029 #define _util_state_stateout_h
00030
00031 #ifdef __GNUC__
00032 #pragma interface
00033 #endif
00034
00035 #include <string>
00036 #include <vector>
00037 #include <map>
00038
00039 #include <util/class/class.h>
00040 #include <util/state/state.h>
00041
00042 namespace sc {
00043
00044 namespace detail {
00046 template <typename T> struct ToStateOut;
00047 }
00048
00049 class StateOutData {
00050 public:
00051 int num;
00052 int size;
00053 int type;
00054 int offset;
00055
00056 StateOutData(): num(0), size(0), type(0), offset(0) {}
00057 };
00058
00066 class StateOut: public DescribedClass {
00067 friend class SavableState;
00068 friend class TranslateDataOut;
00069 private:
00070
00071 StateOut(const StateOut&);
00072 void operator=(const StateOut&);
00073 int have_cd_;
00074 protected:
00075 int dir_loc_loc_;
00076 TranslateDataOut *translate_;
00077 int copy_references_;
00078 int next_object_number_;
00079 std::map<Ref<SavableState>,StateOutData> ps_;
00080 std::map<ClassDescP,int> classidmap_;
00081 int nextclassid_;
00082 int node_to_node_;
00083 virtual int put_array_void(const void*,int);
00084 virtual int putparents(const ClassDesc*);
00085
00086 void put_directory();
00087
00088
00089
00090 void have_classdesc() { have_cd_ = 1; }
00091 int need_classdesc() { int tmp = have_cd_; have_cd_ = 0; return !tmp; }
00092
00097 virtual int putobject(const Ref<SavableState> &);
00098
00100 virtual int put(const ClassDesc*);
00101 public:
00102 StateOut();
00103 virtual ~StateOut();
00104
00106 virtual void put_header();
00107
00110 virtual int putstring(const char*);
00111
00113 virtual int put(const std::string &);
00114
00116 virtual int put(char r);
00117 virtual int put(unsigned int r);
00118 virtual int put(int r);
00119 virtual int put(bool r);
00120 virtual int put(unsigned long r);
00121 virtual int put(long r);
00122 virtual int put(float r);
00123 virtual int put(double r);
00126 virtual int put(const char*,int);
00127 virtual int put(const unsigned int*,int);
00128 virtual int put(const int*,int);
00129 virtual int put(const unsigned long*,int);
00130 virtual int put(const long*,int);
00131 virtual int put(const float*,int);
00132 virtual int put(const double*,int);
00135 virtual int put_array_char(const char*p,int size);
00136 virtual int put_array_uint(const unsigned int*p,int size);
00137 virtual int put_array_int(const int*p,int size);
00138 virtual int put_array_ulong(const unsigned long*p,int size);
00139 virtual int put_array_long(const long*p,int size);
00140 virtual int put_array_float(const float*p,int size);
00141 virtual int put_array_double(const double*p,int size);
00142
00144 template <class T>
00145 int put(typename std::vector<T> &v) {
00146 const size_t l = v.size();
00147 int r = put(l);
00148 if (l) { for (size_t i=0; i<l; ++i) detail::ToStateOut<T>::put(v[i],*this,r); }
00149 return r;
00150 }
00151
00153 template <typename Key, typename Value>
00154 int put(const std::map<Key,Value>& map) {
00155 typedef std::map<Key,Value> Map;
00156 const size_t size = map.size();
00157 int r = put(size);
00158 if (size) {
00159 typedef typename Map::const_iterator citer;
00160 const citer end = map.end();
00161 for(citer i=map.begin(); i!=end; ++i) {
00162 r += put(*i);
00163 }
00164 }
00165 return r;
00166 }
00167
00169 template <typename L, typename R>
00170 int put(const std::pair<L,R>& v) {
00171 int s = 0;
00172 detail::ToStateOut<L>::put(v.first,*this,s);
00173 detail::ToStateOut<R>::put(v.second,*this,s);
00174 return s;
00175 }
00176
00180 void forget_references();
00185 void copy_references();
00186
00188 virtual int use_directory();
00189
00191 virtual void flush();
00192
00197 int node_to_node() const { return node_to_node_; }
00198
00201 virtual int tell();
00204 virtual void seek(int loc);
00207 virtual int seekable();
00208 };
00209
00210 class RefSCMatrix;
00211 class RefSymmSCMatrix;
00212 class RefDiagSCMatrix;
00213
00214 namespace detail {
00216 template <typename T> struct ToStateOut {
00217 static void put(const T& t, StateOut& so, int& count) {
00218 count += so.put(t);
00219 }
00220 };
00222 template <typename T> struct ToStateOut< sc::Ref<T> > {
00223 static void put(const Ref<T>& t, StateOut& so, int& count) {
00224 SavableState::save_state(t.pointer(),so);
00225 }
00226 };
00228 template <> struct ToStateOut<sc::RefSCMatrix> {
00229 static void put(const sc::RefSCMatrix& t, StateOut& so, int& count);
00230 };
00232 template <> struct ToStateOut<sc::RefSymmSCMatrix> {
00233 static void put(const sc::RefSymmSCMatrix& t, StateOut& so, int& count);
00234 };
00236 template <> struct ToStateOut<sc::RefDiagSCMatrix> {
00237 static void put(const sc::RefDiagSCMatrix& t, StateOut& so, int& count);
00238 };
00239 }
00240
00241 }
00242
00243 #endif
00244
00245
00246
00247
00248