#pragma once #ifndef Convention_Runtime_Generics_Sequence_hpp #define Convention_Runtime_Generics_Sequence_hpp #include"Config.hpp" namespace Convention { namespace Generics { /** * @brief 栈上静态数组 * @tparam Element 内容物类型 * @tparam ElementSize 内容物数量 * @version BS 0.0.1 */ template using Array = std::array; /** * @brief 栈上静态Bool数组 * @tparam size 元素大小 * @version BS 0.0.1 */ template class BoolArray : private Array< std::conditional_t, capacity / sizeof(std::conditional_t) + (capacity % sizeof(std::conditional_t) ? 1 : 0) > { private: constexpr static const char* out_of_range_message = "out of range, capacity: "; using _MyElementTy = std::conditional_t; constexpr static size_t _MyCapacity = capacity / sizeof(_MyElementTy) + (capacity % sizeof(_MyElementTy) ? 1 : 0); using _Mybase = Array<_MyElementTy, _MyCapacity>; constexpr _Mybase& _GetBaseArray() noexcept { return *this; } constexpr const _Mybase& _GetBaseArray() const noexcept { return *this; } public: inline constexpr size_t size() const noexcept { return capacity; } int ReadValue(size_t index) const { if (index < capacity) { size_t i = index / sizeof(_MyElementTy), offset = index % sizeof(_MyElementTy); return _GetBaseArray()[i] & (1ll << offset); } throw std::out_of_range(StringIndicator::Combine(out_of_range_message, capacity)); } bool operator[](int index) const { return ReadValue(index < 0 ? capacity + index : index); } void WriteValue(size_t index, bool value) { if (index < capacity) { size_t i = index / sizeof(_MyElementTy), offset = index % sizeof(_MyElementTy); if (value) _GetBaseArray()[i] |= 1ll << offset; else _GetBaseArray()[i] &= ~(1ll << offset); } throw std::out_of_range(StringIndicator::Combine(out_of_range_message, capacity)); } }; /** * @brief 堆上动态数组 * @tparam Element 内容物类型 * @tparam Allocator 内存分配器 * @version BS 0.0.1 */ template class Allocator> using Vector = std::vector>; } } #endif Convention_Runtime_Generics_Sequence_hpp