StormByte C++ Library: Config module 0.0.9999
StormByte-Config is a StormByte library module for parsing configuration files
Loading...
Searching...
No Matches
container.hxx
1#pragma once
2
3#include <StormByte/config/exception.hxx>
4#include <StormByte/config/item/base.hxx>
5#include <StormByte/config/type.hxx>
6
7#include <queue>
8#include <span>
9#include <vector>
10
15namespace StormByte::Config::Item {
21 class STORMBYTE_CONFIG_PUBLIC Container: public Base {
22 public:
26 Container() = default;
27
32 Container(const std::string& name);
33
38 Container(std::string&& name);
39
44 Container(const Container& base) = default;
45
50 Container(Container&& base) noexcept = default;
51
56 Container& operator=(const Container& base) = default;
57
62 Container& operator=(Container&& base) noexcept = default;
63
67 virtual ~Container() noexcept override = default;
68
74 Base& operator[](const size_t& index);
75
81 const Base& operator[](const size_t& index) const;
82
90 Base& operator[](const std::string& path);
91
99 inline const Base& operator[](const std::string& path) const {
100 return LookUp(path);
101 }
102
108 bool operator==(const Container& container) const noexcept;
109
115 inline bool operator!=(const Container& container) const noexcept {
116 return !operator==(container);
117 }
118
127 inline Base& Add(const Base& item, const OnExistingAction& on_existing = OnExistingAction::ThrowException) {
128 return Add(std::move(*item.Clone()), on_existing);
129 }
130
138 inline Base& Add(Base&& item, const OnExistingAction& on_existing = OnExistingAction::ThrowException) {
139 return Add(item.Move(), on_existing);
140 }
141
148 Base& Add(Base::PointerType item, const OnExistingAction& on_existing);
149
153 inline void Clear() noexcept {
154 m_items.clear();
155 }
156
162 bool Exists(const std::string& path) const;
163
169 void Remove(const size_t& index);
170
177 void Remove(const std::string& path);
178
183 std::string Serialize(const int& indent_level) const noexcept override;
184
190 static constexpr std::pair<const char, const char> EnclosureCharacters(const ContainerType& type) noexcept {
191 switch(type) {
192 case ContainerType::Group: return std::make_pair<const char, const char>('{', '}');
193 case ContainerType::List: return std::make_pair<const char, const char>('[', ']');
194 default: return std::make_pair<const char, const char>('\0', '\0');
195 }
196 }
197
203 static constexpr const char EndCharacter(const ContainerType& type) noexcept {
204 switch(type) {
205 case ContainerType::Group: return '}';
206 case ContainerType::List: return ']';
207 default: return '\0';
208 }
209 }
210
215 constexpr std::span<Base::PointerType> Items() noexcept {
216 return std::span(m_items);
217 }
218
223 constexpr std::span<const Base::PointerType> Items() const noexcept {
224 return std::span(m_items);
225 }
226
231 constexpr virtual Item::ContainerType ContainerType() const noexcept = 0;
232
237 constexpr std::string ContainerTypeToString() const noexcept {
238 return Item::TypeToString(this->ContainerType());
239 }
240
245 constexpr Item::Type Type() const noexcept override {
246 return Item::Type::Container;
247 }
248
253 constexpr size_t Size() const noexcept {
254 return m_items.size();
255 }
256
261 size_t Count() const noexcept;
262
263 protected:
264 std::vector<Base::PointerType> m_items;
265
272 virtual Base::PointerType BeforeAdditionActions(Base::PointerType item, const OnExistingAction onexisting) = 0;
273
274 private:
279 virtual std::string ContentsToString(const int& level) const noexcept;
280
286 static bool IsPathValid(const std::string& name) noexcept;
287
294 const Base& LookUp(const std::string& path) const;
295
302 const Base& LookUp(std::queue<std::string>& path) const;
303
309 void Remove(std::queue<std::string>& path);
310 };
311}
The base class for all configuration items.
Definition base.hxx:29
Represents a container that can hold multiple configuration items.
Definition container.hxx:21
constexpr size_t Size() const noexcept
Definition container.hxx:253
void Remove(const std::string &path)
constexpr Item::Type Type() const noexcept override
Definition container.hxx:245
constexpr std::span< Base::PointerType > Items() noexcept
Definition container.hxx:215
Container & operator=(Container &&base) noexcept=default
Container()=default
Constructs an empty Container.
Container & operator=(const Container &base)=default
void Clear() noexcept
Definition container.hxx:153
static constexpr const char EndCharacter(const ContainerType &type) noexcept
Definition container.hxx:203
static constexpr std::pair< const char, const char > EnclosureCharacters(const ContainerType &type) noexcept
Definition container.hxx:190
Base & Add(Base &&item, const OnExistingAction &on_existing=OnExistingAction::ThrowException)
Definition container.hxx:138
void Remove(const size_t &index)
constexpr std::span< const Base::PointerType > Items() const noexcept
Definition container.hxx:223
std::string Serialize(const int &indent_level) const noexcept override
Container(Container &&base) noexcept=default
virtual constexpr Item::ContainerType ContainerType() const noexcept=0
Base & Add(Base::PointerType item, const OnExistingAction &on_existing)
Adds an item to the container.
bool operator==(const Container &container) const noexcept
Container(const std::string &name)
size_t Count() const noexcept
bool Exists(const std::string &path) const
virtual ~Container() noexcept override=default
Base & Add(const Base &item, const OnExistingAction &on_existing=OnExistingAction::ThrowException)
Definition container.hxx:127
Container(const Container &base)=default
bool operator!=(const Container &container) const noexcept
Definition container.hxx:115