Common System 0.2.0
Common interfaces and patterns for system integration
Loading...
Searching...
No Matches
container.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
24#pragma once
25
26#include <concepts>
27#include <type_traits>
28#include <iterator>
29
30namespace kcenon::common {
31namespace concepts {
32
47template<typename T>
48concept Container = requires(T t) {
49 typename T::value_type;
50 typename T::iterator;
51 typename T::const_iterator;
52 { t.begin() } -> std::input_or_output_iterator;
53 { t.end() } -> std::input_or_output_iterator;
54 { t.size() } -> std::convertible_to<std::size_t>;
55 { t.empty() } -> std::convertible_to<bool>;
56};
57
72template<typename T>
73concept SequenceContainer = Container<T> && requires(T t, typename T::value_type v) {
74 { t.push_back(v) };
75 { t.front() } -> std::same_as<typename T::value_type&>;
76 { t.back() } -> std::same_as<typename T::value_type&>;
77};
78
93template<typename T>
94concept AssociativeContainer = Container<T> && requires(T t) {
95 typename T::key_type;
96 { t.find(std::declval<typename T::key_type>()) } -> std::same_as<typename T::iterator>;
97 { t.count(std::declval<typename T::key_type>()) } -> std::convertible_to<std::size_t>;
98};
99
116template<typename T>
118 typename T::mapped_type;
119};
120
137template<typename T>
138concept ResizableContainer = Container<T> && requires(T t, std::size_t n) {
139 { t.resize(n) };
140 { t.reserve(n) };
141 { t.capacity() } -> std::convertible_to<std::size_t>;
142};
143
156template<typename T>
157concept ClearableContainer = Container<T> && requires(T t) {
158 { t.clear() };
159};
160
174template<typename T>
175concept InsertableContainer = Container<T> && requires(T t, typename T::iterator it, typename T::value_type v) {
176 { t.insert(it, v) } -> std::same_as<typename T::iterator>;
177};
178
191template<typename T>
192concept ErasableContainer = Container<T> && requires(T t, typename T::iterator it) {
193 { t.erase(it) } -> std::same_as<typename T::iterator>;
194};
195
208template<typename T>
209concept RandomAccessContainer = Container<T> && requires(T t, std::size_t i) {
210 { t[i] } -> std::same_as<typename T::value_type&>;
211};
212
227template<typename T>
228concept BoundedContainer = Container<T> && requires(const T t) {
229 { t.max_size() } -> std::convertible_to<std::size_t>;
230};
231
247template<typename T>
248concept ThreadSafeContainer = Container<T> && requires(T t) {
249 { t.lock() };
250};
251
267template<typename T>
268concept PoolableContainer = requires(T t) {
269 { t.acquire() };
270 { t.release(std::declval<decltype(t.acquire())>()) };
271 { t.available_count() } -> std::convertible_to<std::size_t>;
272};
273
289template<typename T>
290concept CircularBuffer = Container<T> && requires(const T t) {
291 { t.full() } -> std::convertible_to<bool>;
292 { t.capacity() } -> std::convertible_to<std::size_t>;
293};
294
295} // namespace concepts
296} // namespace kcenon::common
A container that provides key-based access.
Definition container.h:94
A container with fixed maximum capacity.
Definition container.h:228
A container that operates as a circular buffer.
Definition container.h:290
A container that can be cleared.
Definition container.h:157
A type that satisfies basic container requirements.
Definition container.h:48
A container that supports erase operations.
Definition container.h:192
A container that supports insert operations.
Definition container.h:175
A container that maps keys to values.
Definition container.h:117
A container that supports object pooling operations.
Definition container.h:268
A container that supports random access via operator[].
Definition container.h:209
A container that can be resized.
Definition container.h:138
A container that provides sequential access and modification.
Definition container.h:73
A container designed for thread-safe access.
Definition container.h:248
Core interfaces.
Definition adapter.h:21