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