#pragma once #include #include #include #include "def.h" #include "circ/elem_def.h" #include "platform/detail.h" namespace ipc { namespace circ { template class elem_array : public ipc::circ::conn_head { public: using base_t = ipc::circ::conn_head; using policy_t = Policy; using cursor_t = decltype(std::declval().cursor()); using elem_t = typename policy_t::template elem_t; enum : std::size_t { head_size = sizeof(base_t) + sizeof(policy_t), data_size = DataSize, elem_max = (std::numeric_limits>::max)() + 1, // default is 255 + 1 elem_size = sizeof(elem_t), block_size = elem_size * elem_max }; private: policy_t head_; elem_t block_[elem_max] {}; public: cursor_t cursor() const noexcept { return head_.cursor(); } template bool push(Q* que, F&& f) { return head_.push(que, std::forward(f), block_); } template bool force_push(Q* que, F&& f) { return head_.force_push(que, std::forward(f), block_); } template bool pop(Q* que, cursor_t* cur, F&& f) { if (cur == nullptr) return false; return head_.pop(que, *cur, std::forward(f), block_); } }; } // namespace circ } // namespace ipc