53 template<
typename ITER>
class tab_ref {
61 typedef typename std::iterator_traits<ITER>::value_type value_type;
62 typedef typename std::iterator_traits<ITER>::pointer pointer;
63 typedef typename std::iterator_traits<ITER>::pointer const_pointer;
64 typedef typename std::iterator_traits<ITER>::reference reference;
65 typedef typename std::iterator_traits<ITER>::reference const_reference;
66 typedef typename std::iterator_traits<ITER>::difference_type
68 typedef ITER iterator;
69 typedef ITER const_iterator;
70 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
71 typedef std::reverse_iterator<iterator> reverse_iterator;
74 bool empty(
void)
const {
return begin_ == end_; }
75 size_type size(
void)
const {
return end_ - begin_; }
77 const iterator &begin(
void) {
return begin_; }
78 const const_iterator &begin(
void)
const {
return begin_; }
79 const iterator &end(
void) {
return end_; }
80 const const_iterator &end(
void)
const {
return end_; }
81 reverse_iterator rbegin(
void) {
return reverse_iterator(end()); }
82 const_reverse_iterator rbegin(
void)
const
83 {
return const_reverse_iterator(end()); }
84 reverse_iterator rend(
void) {
return reverse_iterator(begin()); }
85 const_reverse_iterator rend(
void)
const
86 {
return const_reverse_iterator(begin()); }
88 reference front(
void) {
return *begin(); }
89 const_reference front(
void)
const {
return *begin(); }
90 reference back(
void) {
return *(--(end())); }
91 const_reference back(
void)
const {
return *(--(end())); }
92 void pop_front(
void) { ++begin_; }
94 const_reference operator [](
size_type ii)
const {
return *(begin_ + ii);}
95 reference operator [](
size_type ii) {
return *(begin_ + ii); }
98 tab_ref(
const ITER &b,
const ITER &e) : begin_(b), end_(e) {}
234 template<
typename ITER,
typename ITER_INDEX>
237 typedef typename std::iterator_traits<ITER>::value_type value_type;
238 typedef typename std::iterator_traits<ITER>::pointer pointer;
239 typedef typename std::iterator_traits<ITER>::reference reference;
240 typedef typename std::iterator_traits<ITER>::difference_type
242 typedef std::random_access_iterator_tag iterator_category;
244 typedef size_t size_type;
247 ITER_INDEX iter_index;
250 {
iterator tmp = *
this; ++iter_index;
return tmp; }
252 {
iterator tmp = *
this; --iter_index;
return tmp; }
253 iterator &operator ++() { ++iter_index;
return *
this; }
254 iterator &operator --() { --iter_index;
return *
this; }
255 iterator &operator +=(difference_type i)
256 { iter_index += i;
return *
this; }
257 iterator &operator -=(difference_type i)
258 { iter_index -= i;
return *
this; }
259 iterator operator +(difference_type i)
const
260 {
iterator it = *
this;
return (it += i); }
261 iterator operator -(difference_type i)
const
262 {
iterator it = *
this;
return (it -= i); }
263 difference_type operator -(
const iterator &i)
const
264 {
return iter_index - i.iter_index; }
266 reference operator *()
const
267 {
return *(piter + *iter_index); }
268 reference operator [](size_type ii)
const
269 {
return *(piter + *(iter_index+ii)); }
271 bool operator ==(
const iterator &i)
const
273 {
return (iter_index == i.iter_index); }
274 bool operator !=(
const iterator &i)
const {
return !(i == *
this); }
275 bool operator < (
const iterator &i)
const
276 {
return (iter_index < i.iter_index); }
277 bool operator > (
const iterator &i)
const
278 {
return (iter_index > i.iter_index); }
279 bool operator >=(
const iterator &i)
const
280 {
return (iter_index >= i.iter_index); }
284 const ITER_INDEX &dnas_iter)
285 : piter(iter), iter_index(dnas_iter) {}
293 template<
typename ITER,
typename ITER_INDEX>
306 typedef std::iterator_traits<ITER> traits_type;
307 typedef typename traits_type::value_type value_type;
308 typedef typename traits_type::pointer pointer;
309 typedef typename traits_type::pointer const_pointer;
310 typedef typename traits_type::reference reference;
311 typedef typename traits_type::reference const_reference;
312 typedef typename traits_type::difference_type difference_type;
313 typedef size_t size_type;
316 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
317 typedef std::reverse_iterator<iterator> reverse_iterator;
322 ITER_INDEX index_begin_, index_end_;
326 bool empty(
void)
const {
return index_begin_ == index_end_; }
327 size_type size(
void)
const {
return index_end_ - index_begin_; }
331 {
return iterator(begin_, index_begin_); }
334 reverse_iterator rbegin(
void) {
return reverse_iterator(end()); }
335 const_reverse_iterator rbegin(
void)
const
336 {
return const_reverse_iterator(end()); }
337 reverse_iterator rend(
void) {
return reverse_iterator(begin()); }
338 const_reverse_iterator rend(
void)
const
339 {
return const_reverse_iterator(begin()); }
341 reference front(
void) {
return *(begin_ + *index_begin_); }
342 const_reference front(
void)
const {
return *(begin_ + *index_begin_); }
343 reference back(
void) {
return *(--(end())); }
344 const_reference back(
void)
const {
return *(--(end())); }
345 void pop_front(
void) { ++index_begin_; }
349 const ITER_INDEX &ei)
350 : begin_(b), index_begin_(bi), index_end_(ei) {}
353 const_reference operator [](size_type ii)
const
354 {
return *(begin_ + index_begin_[ii]);}
355 reference operator [](size_type ii)
356 {
return *(begin_ + index_begin_[ii]); }
365 template<
typename ITER>
struct tab_ref_reg_spaced_iterator_ {
367 typedef typename std::iterator_traits<ITER>::value_type value_type;
368 typedef typename std::iterator_traits<ITER>::pointer pointer;
369 typedef typename std::iterator_traits<ITER>::reference reference;
370 typedef typename std::iterator_traits<ITER>::difference_type
372 typedef typename std::iterator_traits<ITER>::iterator_category
375 typedef tab_ref_reg_spaced_iterator_<ITER> iterator;
380 iterator operator ++(
int) { iterator tmp = *
this; i++;
return tmp; }
381 iterator operator --(
int) { iterator tmp = *
this; i--;
return tmp; }
382 iterator &operator ++() { i++;
return *
this; }
383 iterator &operator --() { i--;
return *
this; }
384 iterator &operator +=(difference_type ii) { i+=ii;
return *
this; }
385 iterator &operator -=(difference_type ii) { i-=ii;
return *
this; }
387 { iterator itt = *
this;
return (itt += ii); }
389 { iterator itt = *
this;
return (itt -= ii); }
390 difference_type
operator -(
const iterator &ii)
const
391 {
return (N ? (it - ii.it) / N : 0) + i - ii.i; }
393 reference operator *()
const {
return *(it + i*N); }
394 reference operator [](
size_type ii)
const {
return *(it + (i+ii)*N); }
396 bool operator ==(
const iterator &ii)
const
397 {
return (*
this - ii) == difference_type(0); }
398 bool operator !=(
const iterator &ii)
const
399 {
return (*
this - ii) != difference_type(0); }
400 bool operator < (
const iterator &ii)
const
401 {
return (*
this - ii) < difference_type(0); }
402 bool operator >=(
const iterator &ii)
const
403 {
return (*
this - ii) >= difference_type(0); }
404 bool operator > (
const iterator &ii)
const
405 {
return (*
this - ii) > difference_type(0); }
407 tab_ref_reg_spaced_iterator_(
void) {}
409 : it(iter), N(n), i(ii) { }
417 template<
typename ITER> tab_ref_reg_spaced_iterator_<ITER>
419 return tab_ref_reg_spaced_iterator_<ITER>(it, stride);
428 typedef typename std::iterator_traits<ITER>::value_type value_type;
429 typedef typename std::iterator_traits<ITER>::pointer pointer;
430 typedef typename std::iterator_traits<ITER>::pointer const_pointer;
431 typedef typename std::iterator_traits<ITER>::reference reference;
432 typedef typename std::iterator_traits<ITER>::reference const_reference;
433 typedef typename std::iterator_traits<ITER>::difference_type
435 typedef size_t size_type;
436 typedef tab_ref_reg_spaced_iterator_<ITER> iterator;
437 typedef iterator const_iterator;
438 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
439 typedef std::reverse_iterator<iterator> reverse_iterator;
448 bool empty(
void)
const {
return size_ == 0; }
449 size_type size(
void)
const {
return size_; }
451 iterator begin(
void) {
return iterator(begin_, N, 0); }
452 const_iterator begin(
void)
const {
return iterator(begin_, N, 0); }
453 iterator end(
void) {
return iterator(begin_, N, size_); }
454 const_iterator end(
void)
const {
return iterator(begin_, N, size_); }
455 reverse_iterator rbegin(
void) {
return reverse_iterator(end()); }
456 const_reverse_iterator rbegin(
void)
const
457 {
return const_reverse_iterator(end()); }
458 reverse_iterator rend(
void) {
return reverse_iterator(begin()); }
459 const_reverse_iterator rend(
void)
const
460 {
return const_reverse_iterator(begin()); }
462 reference front(
void) {
return *begin_; }
463 const_reference front(
void)
const {
return *begin_; }
464 reference back(
void) {
return *(begin_ + N * (size_-1)); }
465 const_reference back(
void)
const {
return *(begin_ + N * (size_-1)); }
466 void pop_front(
void) { begin_ += N; }
470 : begin_(b), N(n), size_(s) {}
473 const_reference operator [](size_type ii)
const
474 {
return *(begin_ + ii * N);}
475 reference operator [](size_type ii) {
return *(begin_ + ii * N); }
480 template<
typename ITER,
typename COND>
482 typedef typename std::iterator_traits<ITER>::value_type value_type;
483 typedef typename std::iterator_traits<ITER>::pointer pointer;
484 typedef typename std::iterator_traits<ITER>::reference reference;
485 typedef typename std::iterator_traits<ITER>::difference_type
487 typedef std::forward_iterator_tag iterator_category;
491 void forward(
void) {
while (!(cond)(*
this)) ITER::operator ++(); }
493 { ITER::operator ++(); forward();
return *
this; }
495 {
iterator tmp = *
this; ++(*this);
return tmp; }
499 : ITER(iter), cond(c) {}
516 typedef typename std::iterator_traits<ITER>::value_type value_type;
517 typedef typename std::iterator_traits<ITER>::pointer pointer;
518 typedef typename std::iterator_traits<ITER>::pointer const_pointer;
519 typedef typename std::iterator_traits<ITER>::reference reference;
520 typedef typename std::iterator_traits<ITER>::reference const_reference;
521 typedef size_t size_type;
526 {
iterator it(begin_, cond); it.forward();
return it; }
528 bool empty(
void)
const {
return begin_ == end_; }
530 value_type front(
void)
const {
return *begin(); }
531 void pop_front(
void) { ++begin_; begin_ = begin(); }
533 COND &condition(
void) {
return cond; }
534 const COND &condition(
void)
const {
return cond; }
538 : begin_(b), end_(e), cond(c) { begin_ = begin(); }
indexed array reference (given a container X, and a set of indexes I, this class provides a pseudo-co...
provide a "strided" view a of container
given a container X and a predicate P, provide pseudo-container Y of all elements of X such that P(X[...
Definition of basic exceptions.
tab_ref_index_ref_iterator_< ITER, ITER_INDEX > index_ref_iterator(ITER it, ITER_INDEX it_i)
convenience template function for quick obtention of a indexed iterator without having to specify its...
tab_ref_reg_spaced_iterator_< ITER > reg_spaced_iterator(ITER it, size_t stride)
convenience template function for quick obtention of a strided iterator without having to specify its...
rational_fraction< T > operator-(const polynomial< T > &P, const rational_fraction< T > &Q)
Subtract Q from P.
rational_fraction< T > operator+(const polynomial< T > &P, const rational_fraction< T > &Q)
Add Q to P.
size_t size_type
used as the common size type in the library
iterator over a gmm::tab_ref_index_ref<ITER,ITER_INDEX>
iterator over a tab_ref_with_selection