13 #ifndef CXXUTILS_CONCURRENTRANGEMAP_H
14 #define CXXUTILS_CONCURRENTRANGEMAP_H
19 #include "boost/range/iterator_range.hpp"
42 template <
class T,
class CONTEXT>
100 template <
class COMPARE,
class RANGE,
class KEY,
class CONTEXT>
108 {
c(
k, r2) } -> std::same_as<bool>;
109 {
c(r1, r2) } -> std::same_as<bool>;
110 {
c.inRange (
k, r2) } -> std::same_as<bool>;
111 {
c.overlap (ctx, r1, r_nc) } -> std::same_as<int>;
112 {
c.extendRange (r_nc, r2) } -> std::same_as<int>;
208 template <
class RANGE,
class KEY,
class T,
class COMPARE,
209 template <
class>
class UPDATER>
212 class ConcurrentRangeMap
215 typedef RANGE key_type;
216 typedef const T* mapped_type;
217 typedef std::pair<RANGE, const T*>
value_type;
220 typedef size_t size_type;
221 typedef int difference_type;
222 typedef COMPARE key_compare;
223 typedef KEY key_query_type;
227 typedef void delete_function (
const T*);
239 DeletePayload (delete_function* delfcn)
246 static void delfcn (
const T*
p)
248 delete reinterpret_cast<const U*
>(
p);
251 DeletePayload (
const std::default_delete<U>&)
253 m_delete = delfcn<U>;
263 delete_function* m_delete;
286 typedef std::unique_ptr<T, DeletePayload> payload_unique_ptr;
289 typedef boost::iterator_range<const_iterator> const_iterator_range;
309 Impl (
size_t capacity = 10);
327 size_t capacity()
const;
332 std::vector<value_type>
m_data;
335 using Updater_t = UPDATER<Impl>;
348 ConcurrentRangeMap (Updater_t&& updater,
349 std::shared_ptr<IPayloadDeleter> payloadDeleter,
350 size_t capacity = 16,
351 const COMPARE&
compare = COMPARE());
359 ~ConcurrentRangeMap();
365 IPayloadDeleter& deleter();
371 const IPayloadDeleter& deleter()
const;
379 const_iterator
find (
const key_query_type&
key)
const;
383 enum class EmplaceResult
422 EmplaceResult emplace (
const RANGE&
range,
423 payload_unique_ptr
ptr,
424 bool tryExtend =
false,
425 const typename Updater_t::Context_t& ctx =
426 Updater_t::defaultContext());
434 void erase (
const key_query_type&
key,
435 const typename Updater_t::Context_t& ctx =
436 Updater_t::defaultContext());
454 int extendLastRange (
const RANGE& newRange,
455 const typename Updater_t::Context_t& ctx =
456 Updater_t::defaultContext());
469 void updateRanges (std::function<
void (RANGE&)> rangeUpdater,
470 const typename Updater_t::Context_t& ctx =
471 Updater_t::defaultContext());
494 size_t trim (
const std::vector<key_query_type>&
keys,
bool trimall =
false);
519 size_t capacity()
const;
525 size_t nInserts()
const;
531 size_t maxSize()
const;
537 const_iterator_range
range()
const;
545 void quiescent (
const typename Updater_t::Context_t& ctx =
546 Updater_t::defaultContext());
552 typedef std::lock_guard<mutex_t>
lock_t;
570 const_iterator getBegin (const_iterator& last)
const;
586 bool anyInRange (
const key_type&
r,
587 const std::vector<key_query_type>&
keys)
const;
599 void installImpl (std::unique_ptr<Impl> new_impl,
602 const typename Updater_t::Context_t& ctx);
614 int extendImpl (
lock_t& lock,
615 const RANGE& extendedRange,
616 const typename Updater_t::Context_t& ctx);
638 std::shared_ptr<IPayloadDeleter> m_payloadDeleter;
654 std::atomic<value_type*> m_begin;
655 std::atomic<value_type*> m_last;
672 #endif // not CXXUTILS_CONCURRENTRANGEMAP_H