00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011
00012
00013 #ifndef _IRREGTAG_H_
00014 #define _IRREGTAG_H_
00015
00016 #include "Vector.H"
00017 #include "VolIndex.H"
00018 #include "IntVectSet.H"
00019 #include <list>
00020 #include "SPMD.H"
00021 #include "NamespaceHeader.H"
00022
00023 class HDF5Handle;
00024 class IrregTag;
00025
00026
00027
00028
00029
00030
00031
00032 class TagSet
00033 {
00034 public:
00035 TagSet()
00036 :
00037 index(0),
00038 list(NULL),
00039 value(NULL)
00040 {
00041 }
00042
00043 TagSet(const Vector<int>* l, const Vector<double>* d);
00044
00045 void begin()
00046 {
00047 index=0;
00048 }
00049
00050 bool ok() const
00051 {
00052 return index < list->size();
00053 }
00054
00055 void operator++()
00056 {
00057 index++;
00058 }
00059
00060 int operator()() const
00061 {
00062 return (*list)[index];
00063 }
00064
00065 double val() const
00066 {
00067 return (*value)[index];
00068 }
00069
00070 private:
00071 int index;
00072 const Vector<int>* list;
00073 const Vector<double>* value;
00074 friend class IrregTag;
00075 };
00076
00077 class IrregTag
00078 {
00079 public:
00080
00081
00082
00083 IrregTag();
00084
00085
00086
00087 ~IrregTag();
00088
00089
00090
00091
00092
00093
00094
00095
00096 void read(const std::string& a_filename);
00097 void read(HDF5Handle& handle);
00098
00099
00100
00101
00102 void write(const std::string& a_filename);
00103
00104
00105
00106
00107 void write(HDF5Handle& handle);
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 void setTags(const VolIndex& a_vol, const Vector<int>& tags,
00118 const Vector<double>& values);
00119
00120
00121
00122 void close();
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136 TagSet tags(const VolIndex& a_index) const ;
00137
00138 int numVol() const ;
00139
00140 TagSet tags(int a_tagsetIndex) const;
00141
00142
00143
00144 private:
00145
00146 class Entry
00147 {
00148 public:
00149 VolIndex m_index;
00150 Vector<int> m_tags;
00151 Vector<double> m_values;
00152
00153 Entry()
00154 {
00155 }
00156
00157 Entry(const VolIndex& index,
00158 const Vector<int>& tags,
00159 const Vector<double>& values)
00160 :
00161 m_index(index),
00162 m_tags(tags),
00163 m_values(values)
00164 {
00165 }
00166
00167 void define(const VolIndex& index,
00168 const Vector<int>& tags,
00169 const Vector<double>& values)
00170 {
00171 m_index = index;
00172 m_tags = tags;
00173 m_values = values;
00174 }
00175
00176 bool operator < (const Entry& rhs) const
00177 {
00178 return m_index < rhs.m_index;
00179 }
00180
00181 int linearSize() const
00182 {
00183 return m_index.linearSize() + CH_XD::linearListSize(m_tags) + CH_XD::linearListSize(m_values);
00184 }
00185
00186 void linearOut(void* const a_outBuf) const
00187 {
00188 char* buf = (char*)a_outBuf;
00189 buf+=m_index.linearSize();
00190 m_index.linearOut(a_outBuf);
00191 CH_XD::linearOut(buf, m_tags);
00192 buf += CH_XD::linearSize(m_tags);
00193 CH_XD::linearOut(buf, m_values);
00194 }
00195
00196 void linearIn(void* const inBuf)
00197 {
00198 const char* buf = (const char*)inBuf;
00199 buf+=m_index.linearSize();
00200 m_index.linearIn(inBuf);
00201 CH_XD::linearIn(m_tags, buf);
00202 buf += CH_XD::linearSize(m_tags);
00203 CH_XD::linearIn(m_values, buf);
00204
00205 }
00206 };
00207
00208 bool m_closed;
00209 IntVectSet m_ivs;
00210 std::list<Entry> m_accumulator;
00211 Vector<Entry> m_set;
00212 };
00213
00214 #include "NamespaceFooter.H"
00215 #endif