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
00032 class TagSet
00033 {
00034 public:
00035 TagSet():index(0), list(NULL), value(NULL) {;}
00036 TagSet(const Vector<int>* l, const Vector<double>* d);
00037 void begin() { index=0;}
00038 bool ok() const {return index < list->size();}
00039 void operator++() {index++;}
00040 int operator()() const {return (*list)[index];}
00041 double val() const { return (*value)[index];}
00042
00043 private:
00044 int index;
00045 const Vector<int>* list;
00046 const Vector<double>* value;
00047 friend class IrregTag;
00048 };
00049
00050 class IrregTag
00051 {
00052 public:
00053
00056 IrregTag();
00057
00060 ~IrregTag();
00061
00062
00063
00068
00069 void read(const std::string& a_filename);
00070 void read(HDF5Handle& handle);
00071
00075 void write(const std::string& a_filename);
00076
00080 void write(HDF5Handle& handle);
00083
00084
00089
00090 void setTags(const VolIndex& a_vol, const Vector<int>& tags,
00091 const Vector<double>& values);
00092
00095 void close();
00096
00099
00100
00109 TagSet tags(const VolIndex& a_index) const ;
00110
00111 int numVol() const ;
00112
00113 TagSet tags(int a_tagsetIndex) const;
00114
00117 private:
00118
00119 class Entry
00120 {
00121 public:
00122 VolIndex m_index;
00123 Vector<int> m_tags;
00124 Vector<double> m_values;
00125 Entry(){;}
00126 Entry(const VolIndex& index, const Vector<int>& tags,
00127 const Vector<double>& values)
00128 :m_index(index), m_tags(tags), m_values(values){;}
00129 void define(const VolIndex& index, const Vector<int>& tags,
00130 const Vector<double>& values){
00131 m_index = index; m_tags = tags; m_values = values;}
00132 bool operator < (const Entry& rhs) const {
00133 return m_index < rhs.m_index;}
00134 int linearSize() const{
00135 return m_index.linearSize() + CH_XD::linearListSize(m_tags)
00136 + CH_XD::linearListSize(m_values);}
00137 void linearOut(void* const a_outBuf) const
00138 {
00139 char* buf = (char*)a_outBuf;
00140 buf+=m_index.linearSize();
00141 m_index.linearOut(a_outBuf);
00142 CH_XD::linearOut(buf, m_tags);
00143 buf += CH_XD::linearSize(m_tags);
00144 CH_XD::linearOut(buf, m_values);
00145 }
00146 void linearIn(void* const inBuf)
00147 {
00148 const char* buf = (const char*)inBuf;
00149 buf+=m_index.linearSize();
00150 m_index.linearIn(inBuf);
00151 CH_XD::linearIn(m_tags, buf);
00152 buf += CH_XD::linearSize(m_tags);
00153 CH_XD::linearIn(m_values, buf);
00154
00155 }
00156 };
00157
00158 bool m_closed;
00159 IntVectSet m_ivs;
00160 std::list<Entry> m_accumulator;
00161 Vector<Entry> m_set;
00162 };
00163
00164 #include "NamespaceFooter.H"
00165 #endif