#pragma once #include // IWYU pragma: keep #include #include #include #include template class glArraysBase { static_assert(N > 0); public: ~glArraysBase() = default; NO_COPY(glArraysBase); CUSTOM_MOVE(glArraysBase); // NOLINTNEXTLINE(hicpp-explicit-conversions) inline operator GLuint() const { static_assert(N == 1, "Implicit cast only if N == 1"); return ids.front(); } inline auto operator[](size_t n) const { return ids[n]; } constexpr static auto size {N}; protected: glArraysBase() noexcept = default; std::array ids {}; }; template inline glArraysBase::glArraysBase(glArraysBase && src) noexcept : ids {src.ids} { std::fill(src.ids.begin(), src.ids.end(), 0); } template inline glArraysBase & glArraysBase::operator=(glArraysBase && src) noexcept { ids = src.ids; std::fill(src.ids.begin(), src.ids.end(), 0); return *this; } template class glArrays : public glArraysBase { public: using glArraysBase::glArraysBase; using glArraysBase::operator=; DEFAULT_MOVE_COPY(glArrays); inline glArrays() noexcept { (*Gen)(N, this->ids.data()); } inline ~glArrays() noexcept { if (this->ids.front()) { (*Del)(N, this->ids.data()); } } }; template using glVertexArrays = glArrays; using glVertexArray = glVertexArrays<1>; template using glBuffers = glArrays; using glBuffer = glBuffers<1>; template using glTextures = glArrays; using glTexture = glTextures<1>; template using glFrameBuffers = glArrays; using glFrameBuffer = glFrameBuffers<1>; template using glRenderBuffers = glArrays; using glRenderBuffer = glRenderBuffers<1>;