14 #ifndef STXXL_ALGO_ADAPTOR_HEADER
15 #define STXXL_ALGO_ADAPTOR_HEADER
17 #include <stxxl/bits/mng/bid.h>
18 #include <stxxl/bits/mng/adaptor.h>
21 __STXXL_BEGIN_NAMESPACE
23 template <
unsigned _blk_sz,
typename _run_type,
class __pos_type =
int_type>
24 struct RunsToBIDArrayAdaptor :
public TwoToOneDimArrayAdaptorBase<_run_type *, BID<_blk_sz>, __pos_type>
26 typedef RunsToBIDArrayAdaptor<_blk_sz, _run_type, __pos_type> _Self;
29 enum { block_size = _blk_sz };
31 unsigned_type dim_size;
33 typedef TwoToOneDimArrayAdaptorBase<_run_type *, BID<_blk_sz>, __pos_type> _Parent;
37 RunsToBIDArrayAdaptor(_run_type ** a, __pos_type p, unsigned_type d)
38 : TwoToOneDimArrayAdaptorBase<_run_type *,
BID<_blk_sz>, __pos_type>(a, p), dim_size(d)
40 RunsToBIDArrayAdaptor(
const _Self & a)
41 : TwoToOneDimArrayAdaptorBase<_run_type *,
BID<_blk_sz>, __pos_type>(a), dim_size(a.dim_size)
44 const _Self & operator = (
const _Self & a)
48 dim_size = a.dim_size;
52 data_type & operator * ()
54 CHECK_RUN_BOUNDS(pos);
55 return (
BID<_blk_sz>&)((*(array[(pos) % dim_size]))[(pos) / dim_size].bid);
58 const data_type * operator -> ()
const
60 CHECK_RUN_BOUNDS(pos);
61 return &((*(array[(pos) % dim_size])[(pos) / dim_size].bid));
65 data_type & operator [] (__pos_type n)
const
69 return (
BID<_blk_sz>&)((*(array[(n) % dim_size]))[(n) / dim_size].bid);
73 BLOCK_ADAPTOR_OPERATORS(RunsToBIDArrayAdaptor)
75 template <
unsigned _blk_sz, typename _run_type, class __pos_type = int_type>
76 struct RunsToBIDArrayAdaptor2
77 : public TwoToOneDimArrayAdaptorBase<_run_type *,
BID<_blk_sz>, __pos_type>
79 typedef RunsToBIDArrayAdaptor2<_blk_sz, _run_type, __pos_type> _Self;
82 typedef TwoToOneDimArrayAdaptorBase<_run_type *, BID<_blk_sz>, __pos_type> ParentClass_;
84 using ParentClass_::pos;
85 using ParentClass_::array;
88 { block_size = _blk_sz };
92 RunsToBIDArrayAdaptor2(_run_type ** a, __pos_type p, int_type _w, int_type _h)
93 : TwoToOneDimArrayAdaptorBase<_run_type *,
BID<_blk_sz>, __pos_type>(a, p),
94 w(_w), h(_h), K(_w * _h)
97 RunsToBIDArrayAdaptor2(
const _Self & a)
98 : TwoToOneDimArrayAdaptorBase<_run_type *,
BID<_blk_sz>, __pos_type>(a),
99 w(a.w), h(a.h), K(a.K)
102 const _Self & operator = (
const _Self & a)
112 data_type & operator * ()
114 register __pos_type i = pos - K;
116 return (
BID<_blk_sz>&)((*(array[(pos) % w]))[(pos) / w].bid);
118 register __pos_type _w = w;
120 return (
BID<_blk_sz>&)((*(array[(i) % _w]))[h + (i / _w)].bid);
123 const data_type * operator -> ()
const
125 register __pos_type i = pos - K;
127 return &((*(array[(pos) % w])[(pos) / w].bid));
130 register __pos_type _w = w;
132 return &((*(array[(i) % _w])[h + (i / _w)].bid));
136 data_type & operator [] (__pos_type n)
const
139 register __pos_type i = n - K;
141 return (
BID<_blk_sz>&)((*(array[(n) % w]))[(n) / w].bid);
144 register __pos_type _w = w;
146 return (
BID<_blk_sz>&)((*(array[(i) % _w]))[h + (i / _w)].bid);
150 BLOCK_ADAPTOR_OPERATORS(RunsToBIDArrayAdaptor2)
153 template <typename trigger_iterator_type>
154 struct trigger_entry_iterator
156 typedef trigger_entry_iterator<trigger_iterator_type> _Self;
157 typedef typename std::iterator_traits<trigger_iterator_type>::value_type::bid_type bid_type;
160 typedef bid_type value_type;
161 typedef std::random_access_iterator_tag iterator_category;
162 typedef int_type difference_type;
163 typedef value_type * pointer;
164 typedef value_type & reference;
166 trigger_iterator_type value;
168 trigger_entry_iterator(
const _Self & a) : value(a.value) { }
169 trigger_entry_iterator(trigger_iterator_type v) : value(v) { }
171 bid_type & operator * ()
175 bid_type * operator -> ()
const
177 return &(value->bid);
179 const bid_type & operator [] (int_type n)
const
181 return (value + n)->bid;
183 bid_type & operator [] (int_type n)
185 return (value + n)->bid;
188 _Self & operator ++ ()
193 _Self operator ++ (
int)
199 _Self & operator -- ()
204 _Self operator -- (
int)
210 bool operator == (
const _Self & a)
const
212 return value == a.value;
214 bool operator != (
const _Self & a)
const
216 return value != a.value;
218 _Self operator += (int_type n)
223 _Self operator -= (int_type n)
228 int_type operator - (
const _Self & a)
const
230 return value - a.value;
232 int_type operator + (
const _Self & a)
const
234 return value + a.value;
238 template <
typename Iterator>
240 trigger_entry_iterator<Iterator>
241 make_bid_iterator(Iterator iter)
243 return trigger_entry_iterator<Iterator>(iter);
246 __STXXL_END_NAMESPACE
248 #endif // !STXXL_ALGO_ADAPTOR_HEADER
Block identifier class.
Definition: bid.h:40