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
00029
00030
00031
00032 #ifndef _CPP_BITS_GSLICE_H
00033 #define _CPP_BITS_GSLICE_H 1
00034
00035 #pragma GCC system_header
00036
00037 namespace std {
00038
00039 class gslice
00040 {
00041 public:
00042 gslice ();
00043 gslice (size_t, const valarray<size_t>&, const valarray<size_t>&);
00044
00045
00046
00047 gslice(const gslice&);
00048 ~gslice();
00049
00050
00051 gslice& operator= (const gslice&);
00052
00053 size_t start () const;
00054 valarray<size_t> size () const;
00055 valarray<size_t> stride () const;
00056
00057 private:
00058 struct _Indexer {
00059 size_t _M_count;
00060 size_t _M_start;
00061 valarray<size_t> _M_size;
00062 valarray<size_t> _M_stride;
00063 valarray<size_t> _M_index;
00064 _Indexer(size_t, const valarray<size_t>&,
00065 const valarray<size_t>&);
00066 void _M_increment_use() { ++_M_count; }
00067 size_t _M_decrement_use() { return --_M_count; }
00068 };
00069
00070 _Indexer* _M_index;
00071
00072 template<typename _Tp> friend class valarray;
00073 };
00074
00075 inline size_t
00076 gslice::start () const
00077 { return _M_index ? _M_index->_M_start : 0; }
00078
00079 inline valarray<size_t>
00080 gslice::size () const
00081 { return _M_index ? _M_index->_M_size : valarray<size_t>(); }
00082
00083 inline valarray<size_t>
00084 gslice::stride () const
00085 { return _M_index ? _M_index->_M_stride : valarray<size_t>(); }
00086
00087 inline gslice::gslice () : _M_index(0) {}
00088
00089 inline
00090 gslice::gslice(size_t __o, const valarray<size_t>& __l,
00091 const valarray<size_t>& __s)
00092 : _M_index(new gslice::_Indexer(__o, __l, __s)) {}
00093
00094 inline
00095 gslice::gslice(const gslice& __g) : _M_index(__g._M_index)
00096 { if (_M_index) _M_index->_M_increment_use(); }
00097
00098 inline
00099 gslice::~gslice()
00100 { if (_M_index && _M_index->_M_decrement_use() == 0) delete _M_index; }
00101
00102 inline gslice&
00103 gslice::operator= (const gslice& __g)
00104 {
00105 if (__g._M_index) __g._M_index->_M_increment_use();
00106 if (_M_index && _M_index->_M_decrement_use() == 0) delete _M_index;
00107 _M_index = __g._M_index;
00108 return *this;
00109 }
00110
00111
00112 }
00113
00114
00115 #endif
00116
00117
00118
00119