15 #ifndef _PASL_DATA_ITEMSEARCH_H_
16 #define _PASL_DATA_ITEMSEARCH_H_
21 namespace itemsearch {
34 template <
class Comparable>
42 template <
class Measured,
class Position,
class Measured_fields,
class Comparator>
53 return Comparator()(pos, Measured_fields::csize(m));
71 template <
class Measured,
class Position,
class Measured_fields>
84 template <
class Position,
class Measured>
91 : position(position), prefix(prefix) { }
97 template <
class Item,
class Algebra>
110 template <
class Pred,
class Measure>
115 for (ptr = seg.
middle; ptr != seg.
end; ptr++) {
116 measured_type m = algebra_type::combine(new_prefix, meas(*ptr));
133 template <
class Measured>
134 static size_t size(Measured& m) {
138 template <
class Measured>
146 template <
class Fixedcapacity_queue,
class Algebra,
class Size_access=no_size_access>
172 template <
class Pred,
class Measure>
174 const Pred& p)
const {
190 segment_type seg1 = segment_by_index(items, 0);
191 segment_type seg2 = segment_by_index(items, sz - 1);
192 if (seg1.begin == seg2.begin) {
193 assert(seg1.end - seg1.begin == sz);
195 return result_type(res.position - seg1.begin + 1, res.prefix);
201 if (res.position != seg1.end)
203 seg2 = segment_type(seg2.begin, seg2.begin, seg2.end);
205 size_type seg1_nb = seg1.end - seg1.begin;
206 size_type seg2_nb = res.position - seg2.begin;
207 i = seg1_nb + seg2_nb;
215 template <
class Measure>
218 if (! Size_access::enable_index_optimization) {
224 size_type sz_prefix = Size_access::csize(prefix);
226 size_type sz_with_items = nb_items + sz_prefix;
227 assert(target <= sz_with_items + 1);
229 if (target == sz_with_items + 1) {
231 res.
prefix = algebra_type::identity();
235 res.
prefix = algebra_type::identity();
236 Size_access::size(res.
prefix) = target - 1;
246 template <
class Chunk,
248 class Size_access=no_size_access,
249 template <
class Fixedcapacity_queue,
class Cache2,
class Size_access2>
250 class Queue_search=search_in_fixed_capacity_queue>
269 template <
class Pred,
class Measure>
271 const Pred& p)
const {
273 return search(chunk.items, meas, prefix, p);
Position get_position() const
typename chunk_type::value_type value_type
typename queue_type::value_type value_type
static size_t size(Measured &m)
result_type operator()(const queue_type &items, const Measure &meas, measured_type prefix, const Pred &p) const
typename Algebra::value_type measured_type
bool operator()(Comparable x, Comparable y)
Fixed-capacity array along with cached measurement of array contents.
compare_measured_by_position< Measured, Position, Measured_fields, less_than< Position >> less_than_by_position
static size_t csize(Measured m)
static constexpr bool enable_index_optimization
search_result< const_pointer, measured_type > result_type
const value_type * const_pointer
Result of a search for an item in a sequence.
typename queue_search_type::result_type result_type
segment< const Item * > make_const_segment(segment< Item * > seg)
static result_type search_by(segment_type seg, const Measure &meas, measured_type prefix, const Pred &p)
typename Algebra::value_type measured_type
result_type operator()(const chunk_type &chunk, const Measure &meas, measured_type prefix, const Pred &p) const
typename Chunk::queue_type queue_type
compare_measured_by_position(Position pos)
search_result(Position position, Measured prefix)
result_type operator()(const queue_type &items, const Measure &meas, measured_type prefix, const less_than_by_position< measured_type, size_type, Size_access > &p) const
segment< const_pointer > segment_type
typename Algebra::value_type measured_type
Queue_search< queue_type, algebra_type, Size_access > queue_search_type
bool operator()(Measured m) const
Fixedcapacity_queue queue_type
search_result< size_type, measured_type > result_type