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 #ifndef VALUE_HOLDER_H
00028 #define VALUE_HOLDER_H
00029
00030 #include <ost/base.hh>
00031 #include <ost/img/module_config.hh>
00032 #include <ost/img/data_types.hh>
00033 #include <ost/img/size.hh>
00034
00035 #include "index.hh"
00036 #include "type_fw.hh"
00037
00038 namespace value_holder_test {
00039
00040 template <typename V>
00041 void ReleaseAndReconstruct();
00042
00043 }
00044
00045 #define USE_ROW_ORDER 1
00046
00047
00048
00049 namespace ost { namespace img { namespace image_state {
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 template <typename V>
00062 class TEMPLATE_EXPORT ValueHolder {
00063 public:
00064 typedef V* VPtr;
00065 typedef const V* ConstVPtr;
00066 typedef VPtr* VPtrPtr;
00067
00071
00072 ValueHolder(const Size& s);
00073
00075 ValueHolder(const Size& s, const Size& ps);
00076
00078 ValueHolder(const ValueHolder<V>& h);
00079
00080
00082
00087 ValueHolder& operator=(const ValueHolder<V>& h);
00088
00090 ~ValueHolder();
00091
00092
00094 void Swap(ValueHolder& vh);
00096
00097 static DataType GetDataType();
00098
00099 std::size_t MemSize() const;
00100
00101
00102
00104
00108 V& Value(const Index& i)
00109 {
00110 #ifdef USE_ROW_ORDER
00111 assert(i.w<depth_);
00112 return data_[i.u*height_depth_ + i.v*depth_ +i.w];
00113 #else
00114 assert(i.v<height_);
00115 return data_[i.w*width_height_ + i.v*height_ +i.u];
00116 #endif
00117 }
00118
00120
00124 const V& Value(const Index& i) const
00125 {
00126 #ifdef USE_ROW_ORDER
00127 assert(i.w<depth_);
00128 return data_[i.u*height_depth_ + i.v*depth_ +i.w];
00129 #else
00130 assert(i.v<height_);
00131 return data_[i.w*width_height_ + i.v*height_ +i.u];
00132 #endif
00133 }
00134
00136 VPtr GetData() {return &data_[0];}
00138 ConstVPtr GetData() const {return &data_[0];}
00139
00140
00141 ConstVPtr GetEnd() const {return &data_[0]+data_.size();}
00142
00143
00144 private:
00145 #ifdef USE_ROW_ORDER
00146 std::size_t depth_;
00147 std::size_t height_depth_;
00148 #else
00149 std::size_t height_;
00150 std::size_t width_height_;
00151 #endif
00152
00153
00154 std::vector<V> data_;
00155
00156 };
00157
00158 }}}
00159
00160 #endif