Macaulay2 Engine
Loading...
Searching...
No Matches
Range.hpp
Go to the documentation of this file.
1#ifndef __range__
2#define __range__
3
33
34#include "newdelete.hpp"
35#include <utility>
36#include <vector>
37
38template<typename T>
39class Range
40{
41private:
44public:
45 Range() : mFirst(nullptr), mLast(nullptr) {}
46 Range(T* first, T* last) : mFirst(first), mLast(last) {}
47 Range(std::pair<T*, T*> a) : mFirst(a.first), mLast(a.second) {}
48
49 template<class S> Range(const Range<S>& copy) : mFirst(copy.begin()), mLast(copy.end()) {}
50
51 explicit Range(std::vector<T>& vec) : mFirst(vec.data()), mLast(vec.data() + vec.size()) {}
52 explicit Range(VECTOR(T)& vec) : mFirst(vec.data()), mLast(vec.data() + vec.size()) {}
53
54 int size() const { return mLast - mFirst; }
55 T* begin() { return mFirst; }
56 T* end() { return mLast; }
57
58 const T* begin() const { return mFirst; }
59 const T* end() const { return mLast; }
60
61 T& operator[](int i) { return *(mFirst + i); }
62 const T& operator[](int i) const { return *(mFirst + i); }
63
64 const T* cbegin() const { return mFirst; }
65 const T* cend() const { return mLast; }
66};
67
68template<typename U, typename T>
70{
71private:
74public:
75 ZipIterator(U* ptr1, T* ptr2) : mPtr1(ptr1), mPtr2(ptr2) {}
76
77 std::pair<U,T> operator* () { return std::make_pair(*mPtr1,*mPtr2); }
78
80 ++mPtr1;
81 ++mPtr2;
82 return *this;
83 }
84
85 bool operator== (ZipIterator& it) { return (mPtr1 == it.mPtr1) && (mPtr2 == it.mPtr2); }
86 bool operator!= (ZipIterator& it) { return (mPtr1 != it.mPtr1) && (mPtr2 != it.mPtr2); }
87};
88
89template<typename U, typename T>
91{
92private:
93 const U* mPtr1;
94 const T* mPtr2;
95public:
96 ConstZipIterator(const U* ptr1, const T* ptr2) : mPtr1(ptr1), mPtr2(ptr2) {}
97
98 const std::pair<U,T> operator* () { return std::make_pair(*mPtr1,*mPtr2); }
99
101 ++mPtr1;
102 ++mPtr2;
103 return *this;
104 }
105
106 bool operator== (ConstZipIterator& it) { return (mPtr1 == it.mPtr1) && (mPtr2 == it.mPtr2); }
107 bool operator!= (ConstZipIterator& it) { return (mPtr1 != it.mPtr1) && (mPtr2 != it.mPtr2); }
108};
109
110// both ranges *must* be the same size. No bounds checking is done!!
111template<typename U, typename T>
113{
114private:
117public:
118 PairRange(Range<U> range1, Range<T> range2) : mRange1(range1), mRange2(range2) {}
119
120 int size() const { return mRange1.size(); }
121
124
125 ConstZipIterator<U,T> begin() const { return ConstZipIterator<U,T>(mRange1.cbegin(),mRange2.cbegin()); }
127
128 //ConstZipIterator<U,T> cbegin() const { return ConstZipIterator<U,T>(mRange1.cbegin(),
129 // mRange2.cbegin()); }
130 //ConstZipIterator<U,T> cend() const { return ConstZipIterator<U,T>(mRange1.cend(),
131 // mRange2.cend()); }
132
133};
134
135#endif
136
137// Local Variables:
138// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
139// indent-tabs-mode: nil
140// End:
ConstZipIterator(const U *ptr1, const T *ptr2)
Definition Range.hpp:96
const T * mPtr2
Definition Range.hpp:94
bool operator==(ConstZipIterator &it)
Definition Range.hpp:106
bool operator!=(ConstZipIterator &it)
Definition Range.hpp:107
const ConstZipIterator & operator++()
Definition Range.hpp:100
const U * mPtr1
Definition Range.hpp:93
const std::pair< U, T > operator*()
Definition Range.hpp:98
ZipIterator< U, T > begin()
Definition Range.hpp:122
Range< U > mRange1
Definition Range.hpp:115
ConstZipIterator< U, T > end() const
Definition Range.hpp:126
Range< T > mRange2
Definition Range.hpp:116
int size() const
Definition Range.hpp:120
PairRange(Range< U > range1, Range< T > range2)
Definition Range.hpp:118
ConstZipIterator< U, T > begin() const
Definition Range.hpp:125
ZipIterator< U, T > end()
Definition Range.hpp:123
const T & operator[](int i) const
Definition Range.hpp:62
Range(const Range< S > &copy)
Definition Range.hpp:49
const T * cend() const
Definition Range.hpp:65
const T * cbegin() const
Definition Range.hpp:64
const T * begin() const
Definition Range.hpp:58
const T * end() const
Definition Range.hpp:59
Range(std::vector< T > &vec)
Definition Range.hpp:51
Range(T *first, T *last)
Definition Range.hpp:46
Range(std::pair< T *, T * > a)
Definition Range.hpp:47
Range()
Definition Range.hpp:45
T * mLast
Definition Range.hpp:43
T & operator[](int i)
Definition Range.hpp:61
T * end()
Definition Range.hpp:56
T * mFirst
Definition Range.hpp:42
Range(VECTOR(T)&vec)
Definition Range.hpp:52
int size() const
Definition Range.hpp:54
T * begin()
Definition Range.hpp:55
std::pair< U, T > operator*()
Definition Range.hpp:77
const ZipIterator & operator++()
Definition Range.hpp:79
T * mPtr2
Definition Range.hpp:73
bool operator!=(ZipIterator &it)
Definition Range.hpp:86
ZipIterator(U *ptr1, T *ptr2)
Definition Range.hpp:75
U * mPtr1
Definition Range.hpp:72
bool operator==(ZipIterator &it)
Definition Range.hpp:85
#define VECTOR(T)
Definition newdelete.hpp:78
our_new_delete — per-class opt-in routing of new / delete through bdwgc.
#define T
Definition table.c:13