diff --git a/include/circ_elem_array.h b/include/circ_elem_array.h index 607a7d9..9ab4f59 100644 --- a/include/circ_elem_array.h +++ b/include/circ_elem_array.h @@ -33,6 +33,10 @@ struct alignas(std::max_align_t) elem_array_head { return cc_.load(std::memory_order_acquire); } + u2_t cursor(void) const { + return wt_.load(std::memory_order_acquire); + } + auto acquire(void) { while (lc_.exchange(1, std::memory_order_acquire)) { std::this_thread::yield(); @@ -62,6 +66,9 @@ public: using base_t = elem_array_head; using head_t = elem_head; + using typename base_t::u1_t; + using typename base_t::u2_t; + enum : std::size_t { head_size = elem_array_head_size, data_size = DataSize, @@ -95,6 +102,7 @@ public: using base_t::connect; using base_t::disconnect; using base_t::conn_count; + using base_t::cursor; void* acquire(void) { elem_t* el = elem(base_t::acquire()); @@ -116,12 +124,8 @@ public: base_t::commit(); } - u2_t cursor(void) const { - return wt_.load(std::memory_order_acquire); - } - void* take(u2_t cursor) { - return elem(index_of(cursor))->data_; + return elem(base_t::index_of(cursor))->data_; } void put(void* ptr) { diff --git a/include/circ_queue.h b/include/circ_queue.h index b294189..8c02ca5 100644 --- a/include/circ_queue.h +++ b/include/circ_queue.h @@ -19,7 +19,7 @@ public: private: array_t* elems_ = nullptr; - typename std::result_of::type cursor_ = 0; + typename array_t::u2_t cursor_ = 0; bool connected_ = false; public: diff --git a/test/test_circ.cpp b/test/test_circ.cpp index cff6abb..23860b3 100644 --- a/test/test_circ.cpp +++ b/test/test_circ.cpp @@ -144,7 +144,7 @@ struct test_cq; template struct test_cq> { using ca_t = ipc::circ::elem_array; - using cn_t = typename std::result_of::type; + using cn_t = typename ca_t::u2_t; ca_t* ca_;