#pragma once #include #include template struct Array : std::array { using reference = typename std::array::reference; using const_reference = typename std::array::const_reference; using size_type = typename std::array::size_type; constexpr int32_t ssize() const; constexpr reference at(int32_t pos); constexpr const_reference at(int32_t pos) const; }; template constexpr int32_t Array::ssize() const { auto size = this->size(); assert(size < INT32_MAX); #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wshorten-64-to-32" return size; #pragma clang diagnostic pop } template constexpr typename Array::reference Array::at(int32_t pos) { assert(pos >= 0); #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wshorten-64-to-32" return std::array::at(static_cast(pos)); #pragma clang diagnostic pop } template constexpr typename Array::const_reference Array::at(int32_t pos) const { assert(pos >= 0); #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wshorten-64-to-32" return std::array::at(static_cast(pos)); #pragma clang diagnostic pop }