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_statein_h
00029
#define _util_state_statein_h
00030
00031
#ifdef __GNUC__
00032
#pragma interface
00033
#endif
00034
00035
#include <string>
00036
#include <vector>
00037
#include <map>
00038
00039
#include <util/state/state.h>
00040
#include <util/keyval/keyval.h>
00041
00042
namespace sc {
00043
00044
class StateInData {
00045
public:
00046 Ref<SavableState> ptr;
00047
int size;
00048
int type;
00049
int offset;
00050
00051 StateInData(): size(0), type(0), offset(0) {}
00052 };
00053
00054
class StateClassData {
00055
public:
00056
int version;
00057
char *name;
00058
const ClassDesc *classdesc;
00059
int ninstance;
00060
public:
00061 StateClassData(
int v=-1,
const ClassDesc *c=0,
char *name=0):
00062 version(v), name(name), classdesc(c), ninstance(0) {}
00063 StateClassData(
const StateClassData &d) { operator=(d); }
00064 ~StateClassData();
00065 StateClassData &operator=(
const StateClassData &d);
00066 };
00067
00070 class StateIn:
public DescribedClass {
00071
friend class SavableState;
00072
friend class TranslateDataIn;
00073
private:
00074
00075
StateIn(
const StateIn&);
00076
void operator=(
const StateIn&);
00077
int have_cd_;
00078
int dir_loc_;
00079
char key_[KeyVal::MaxKeywordLength];
00080
int keylength_;
00081
protected:
00082
Ref<KeyVal> override_;
00083
TranslateDataIn *translate_;
00084 std::map<int,StateInData> ps_;
00085
int expected_object_num_;
00086 std::map<ClassDescP,int> classidmap_;
00087 std::map<int,StateClassData> classdatamap_;
00088
int nextclassid_;
00089
int node_to_node_;
00090
int version_;
00091
int date_;
00092
char userid_[9];
00093
char format_;
00094
virtual int get_array_void(
void*,
int);
00095
00096
int push_key(
const char *key);
00097
void pop_key(
int n) { key_[n] =
'\0'; keylength_ = n; }
00098
const char *key() {
return key_; }
00099
00100
void get_directory();
00101
int directory_location()
const {
return dir_loc_; }
00102
void find_and_get_directory();
00103
00104
00105
00111
virtual int getobject(
Ref<SavableState> &);
00112
00114
virtual int dir_getobject(
Ref<SavableState> &,
const char *name);
00115
00120
virtual void haveobject(
int,
const Ref<SavableState> &);
00121
00124
virtual void nextobject(
int);
00125
virtual void haveobject(
const Ref<SavableState> &);
00126
00127
void have_classdesc() { have_cd_ = 1; }
00128
int need_classdesc() {
int tmp = have_cd_; have_cd_ = 0;
return !tmp; }
00129
00134
virtual int get(
const ClassDesc**);
00135
public:
00136
StateIn();
00137
virtual ~
StateIn();
00138
00141
virtual void get_header();
00142
00145
virtual int version(
const ClassDesc*);
00146
00148
virtual int getstring(
char*&);
00149
00151
virtual int get(std::string&);
00152
00154
virtual int get(
char&r,
const char *keyword = 0);
00155
virtual int get(
unsigned int&r,
const char *keyword = 0);
00156
virtual int get(
int&r,
const char *keyword = 0);
00157
virtual int get(
float&r,
const char *keyword = 0);
00158
virtual int get(
double&r,
const char *keyword = 0);
00161
virtual int get(
char*&);
00162
virtual int get(
unsigned int*&);
00163
virtual int get(
int*&);
00164
virtual int get(
float*&);
00165
virtual int get(
double*&);
00168
virtual int get_array_char(
char*p,
int size);
00169
virtual int get_array_uint(
unsigned int*p,
int size);
00170
virtual int get_array_int(
int*p,
int size);
00171
virtual int get_array_float(
float*p,
int size);
00172
virtual int get_array_double(
double*p,
int size);
00173
00175
template <
class T>
00176 int get(
typename std::vector<T> &v) {
00177
int l;
00178
int r =
get(l);
00179
if (l) { v.resize(l);
for (
int i=0; i<l; i++) r +=
get(v[i]); }
00180
return r;
00181 }
00182
00187 int node_to_node()
const {
return node_to_node_; }
00188
00190
virtual int use_directory();
00191
00193
virtual int tell();
00196
virtual void seek(
int);
00199
virtual int seekable();
00200
int has_directory()
const {
return dir_loc_ != 0; }
00201
00204
virtual void list_objects(std::ostream& = ExEnv::out0());
00205
00208 void set_override(
const Ref<KeyVal>&kv) { override_ = kv; }
00210 const Ref<KeyVal> &
override()
const {
return override_; }
00211 };
00212
00213 }
00214
00215
#endif
00216
00217
00218
00219
00220