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 
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