123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- #ifndef _GSLICE_H
- #define _GSLICE_H 1
- #pragma GCC system_header
- namespace std _GLIBCXX_VISIBILITY(default)
- {
- _GLIBCXX_BEGIN_NAMESPACE_VERSION
-
-
- class gslice
- {
- public:
-
- gslice();
-
- gslice(size_t __o, const valarray<size_t>& __l,
- const valarray<size_t>& __s);
-
-
-
-
- gslice(const gslice&);
-
- ~gslice();
-
-
- gslice& operator=(const gslice&);
-
- size_t start() const;
-
- valarray<size_t> size() const;
-
-
- valarray<size_t> stride() const;
- private:
- struct _Indexer
- {
- size_t _M_count;
- size_t _M_start;
- valarray<size_t> _M_size;
- valarray<size_t> _M_stride;
- valarray<size_t> _M_index;
- _Indexer()
- : _M_count(1), _M_start(0), _M_size(), _M_stride(), _M_index() {}
- _Indexer(size_t, const valarray<size_t>&,
- const valarray<size_t>&);
- void
- _M_increment_use()
- { ++_M_count; }
-
- size_t
- _M_decrement_use()
- { return --_M_count; }
- };
- _Indexer* _M_index;
- template<typename _Tp> friend class valarray;
- };
- inline size_t
- gslice::start() const
- { return _M_index ? _M_index->_M_start : 0; }
- inline valarray<size_t>
- gslice::size() const
- { return _M_index ? _M_index->_M_size : valarray<size_t>(); }
- inline valarray<size_t>
- gslice::stride() const
- { return _M_index ? _M_index->_M_stride : valarray<size_t>(); }
-
-
- inline
- gslice::gslice()
- : _M_index(new gslice::_Indexer()) {}
- inline
- gslice::gslice(size_t __o, const valarray<size_t>& __l,
- const valarray<size_t>& __s)
- : _M_index(new gslice::_Indexer(__o, __l, __s)) {}
- inline
- gslice::gslice(const gslice& __g)
- : _M_index(__g._M_index)
- { if (_M_index) _M_index->_M_increment_use(); }
- inline
- gslice::~gslice()
- {
- if (_M_index && _M_index->_M_decrement_use() == 0)
- delete _M_index;
- }
- inline gslice&
- gslice::operator=(const gslice& __g)
- {
- if (__g._M_index)
- __g._M_index->_M_increment_use();
- if (_M_index && _M_index->_M_decrement_use() == 0)
- delete _M_index;
- _M_index = __g._M_index;
- return *this;
- }
-
- _GLIBCXX_END_NAMESPACE_VERSION
- }
- #endif
|