diff --git a/include/libconcur/queue.h b/include/libconcur/queue.h index 7aa20a1..392c10c 100644 --- a/include/libconcur/queue.h +++ b/include/libconcur/queue.h @@ -38,8 +38,8 @@ private: : header_(std::forward(model)) {} /// \brief element elements[0]; - element *elements() noexcept { - return &elements_start_; + ::LIBIMP::span> elements() noexcept { + return {&elements_start_, header_.circ_size}; } }; @@ -74,6 +74,29 @@ public: MR *memory_resource = ::LIBPMR::new_delete_resource::get()) noexcept : data_allocator_(memory_resource) , data_(init(circ_size)) {} + + template = true> + explicit queue(MR *memory_resource) noexcept + : queue(default_circle_buffer_size, memory_resource) {} + + bool valid() const noexcept { + return data_ != nullptr; + } + + explicit operator bool() const noexcept { + return valid(); + } + + template + bool push(U &&value) noexcept { + if (!valid()) return false; + return data_->model_.enqueue(data_->elements(), data_->header_, context_, std::forward(value)); + } + + bool pop(value_type &value) noexcept { + if (!valid()) return false; + return data_->model_.dequeue(data_->elements(), data_->header_, context_, value); + } }; LIBCONCUR_NAMESPACE_END_