00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef TJVALLIST_H
00019 #define TJVALLIST_H
00020
00021 #include <tjutils/tjvector.h>
00022 #include <tjutils/tjlabel.h>
00023
00035 template <class T>
00036 class ValList : public virtual Labeled {
00037
00038
00042 struct ValListData {
00043
00044 ValListData() : val(0), times(1), sublists(0), elements_size_cache(0), references(0) {}
00045
00046 ValListData(const ValListData& vld) : times(vld.times), elements_size_cache(vld.elements_size_cache), references(0) {
00047 if(vld.val) val=new T(*vld.val);
00048 else val=0;
00049 if(vld.sublists) sublists=new STD_list< ValList<T> >(*vld.sublists);
00050 else sublists=0;
00051 }
00052
00053 ~ValListData() {
00054 if(sublists) delete sublists;
00055 if(val) delete val;
00056 }
00057
00058
00059 T* val;
00060 unsigned int times;
00061 STD_list< ValList<T> >* sublists;
00062 unsigned int elements_size_cache;
00063 unsigned short references;
00064 };
00065
00066
00067 public:
00068
00072 ValList(const STD_string& object_label="unnamedValList", unsigned int repetitions=1);
00073
00077 ValList(T value);
00078
00082 ValList(const ValList<T>& vl);
00083
00084 ~ValList();
00085
00089 ValList& operator = (const ValList<T>& vl);
00090
00094 ValList& set_value(T value);
00095
00099 ValList& add_sublist(const ValList<T>& vl);
00100
00104 ValList& multiply_repetitions(unsigned int reptimes) {copy_on_write(); data->times*=reptimes; return *this;}
00105
00109 STD_vector<T> get_values_flat() const;
00110
00114 STD_vector<T> get_elements_flat() const;
00115
00119 bool operator == (const ValList<T>& vl) const;
00120
00124 bool operator < (const ValList<T>& vl) const;
00125
00129 T operator [] (unsigned int i) const;
00130
00131
00135
00136
00140 unsigned int size() const {return data->times*data->elements_size_cache;}
00141
00145 STD_string printvallist() const;
00146
00150 bool parsevallist(const STD_string& str);
00151
00155 STD_ostream& print2stream(STD_ostream& os) const;
00156
00160 void clear();
00161
00162 private:
00163 friend class ValListTest;
00164
00165 bool equalelements (const ValList<T>& vl) const;
00166
00167 ValList& increment_repetitions(unsigned int reptimes) {copy_on_write(); data->times+=reptimes; return *this;}
00168
00169 unsigned int get_repetitions() const {return data->times;}
00170
00171 void flatten_sublists();
00172
00173 void copy_on_write();
00174
00175 ValListData* data;
00176 };
00177
00179
00182 #endif