summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/glArrays.cpp21
-rw-r--r--lib/glArrays.h76
-rw-r--r--lib/glBuffers.cpp13
-rw-r--r--lib/glBuffers.h64
-rw-r--r--lib/glVertexArrays.cpp13
-rw-r--r--lib/glVertexArrays.h64
6 files changed, 97 insertions, 154 deletions
diff --git a/lib/glArrays.cpp b/lib/glArrays.cpp
new file mode 100644
index 0000000..7c5b2ea
--- /dev/null
+++ b/lib/glArrays.cpp
@@ -0,0 +1,21 @@
+#include "glArrays.h"
+#include <type_traits>
+
+// Base
+static_assert(!std::is_default_constructible_v<glArraysBase<1>>);
+static_assert(!std::is_copy_constructible_v<glArraysBase<1>>);
+static_assert(!std::is_copy_assignable_v<glArraysBase<1>>);
+static_assert(std::is_nothrow_move_constructible_v<glArraysBase<1>>);
+static_assert(std::is_nothrow_move_assignable_v<glArraysBase<1>>);
+
+// Specialisations (glBuffer is an example of the typedef)
+static_assert(std::is_nothrow_default_constructible_v<glBuffer>);
+static_assert(!std::is_trivially_default_constructible_v<glBuffer>);
+static_assert(std::is_nothrow_destructible_v<glBuffer>);
+static_assert(!std::is_trivially_destructible_v<glBuffer>);
+static_assert(std::is_default_constructible_v<glBuffer>);
+static_assert(!std::is_copy_constructible_v<glBuffer>);
+static_assert(!std::is_copy_assignable_v<glBuffer>);
+static_assert(std::is_nothrow_move_constructible_v<glBuffer>);
+static_assert(std::is_nothrow_move_assignable_v<glBuffer>);
+static_assert(sizeof(glBuffer) == sizeof(GLuint));
diff --git a/lib/glArrays.h b/lib/glArrays.h
new file mode 100644
index 0000000..ed05eeb
--- /dev/null
+++ b/lib/glArrays.h
@@ -0,0 +1,76 @@
+#pragma once
+
+#include <GL/glew.h>
+#include <algorithm> // IWYU pragma: keep
+#include <array>
+#include <cstddef>
+#include <special_members.hpp>
+
+template<size_t N> 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<GLuint, N> ids {};
+};
+
+template<size_t N> inline glArraysBase<N>::glArraysBase(glArraysBase<N> && src) noexcept : ids {src.ids}
+{
+ std::fill(src.ids.begin(), src.ids.end(), 0);
+}
+
+template<size_t N>
+inline glArraysBase<N> &
+glArraysBase<N>::operator=(glArraysBase<N> && src) noexcept
+{
+ ids = src.ids;
+ std::fill(src.ids.begin(), src.ids.end(), 0);
+ return *this;
+}
+
+template<size_t N, auto Gen, auto Del> class glArrays : public glArraysBase<N> {
+public:
+ using glArraysBase<N>::glArraysBase;
+ using glArraysBase<N>::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<size_t N> using glVertexArrays = glArrays<N, &glGenVertexArrays, &glDeleteVertexArrays>;
+using glVertexArray = glVertexArrays<1>;
+template<size_t N> using glBuffers = glArrays<N, &glGenBuffers, &glDeleteBuffers>;
+using glBuffer = glBuffers<1>;
+template<size_t N> using glTextures = glArrays<N, &glGenTextures, &glDeleteTextures>;
+using glTexture = glTextures<1>;
diff --git a/lib/glBuffers.cpp b/lib/glBuffers.cpp
deleted file mode 100644
index cb5ab2a..0000000
--- a/lib/glBuffers.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "glBuffers.h"
-
-void
-glBuffersBase::gen(GLsizei n, GLuint * ids)
-{
- glGenBuffers(n, ids);
-}
-
-void
-glBuffersBase::del(GLsizei n, const GLuint * ids)
-{
- glDeleteBuffers(n, ids);
-}
diff --git a/lib/glBuffers.h b/lib/glBuffers.h
deleted file mode 100644
index e2c09df..0000000
--- a/lib/glBuffers.h
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef GLBUFFERS_H
-#define GLBUFFERS_H
-
-#include <GL/glew.h>
-#include <algorithm> // IWYU pragma: keep
-#include <array>
-#include <cstddef>
-#include <special_members.hpp>
-
-class glBuffersBase {
-protected:
- static void gen(GLsizei, GLuint *);
- static void del(GLsizei, const GLuint *);
-};
-
-template<size_t N> class glBuffers : glBuffersBase {
-public:
- glBuffers()
- {
- gen(N, ids.data());
- }
-
- ~glBuffers()
- {
- del(N, ids.data());
- }
-
- NO_COPY(glBuffers);
- CUSTOM_MOVE(glBuffers);
-
- // NOLINTNEXTLINE(hicpp-explicit-conversions)
- operator GLuint() const
- {
- static_assert(N == 1, "Implicit cast only if N == 1");
- return ids.front();
- }
-
- auto
- operator[](size_t n) const
- {
- return ids[n];
- }
-
-private:
- std::array<GLuint, N> ids {};
-};
-
-template<size_t N> glBuffers<N>::glBuffers(glBuffers<N> && src) noexcept : ids {src.ids}
-{
- std::fill(src.ids.begin(), src.ids.end(), -1);
-}
-
-template<size_t N>
-glBuffers<N> &
-glBuffers<N>::operator=(glBuffers<N> && src) noexcept
-{
- ids = src.ids;
- std::fill(src.ids.begin(), src.ids.end(), -1);
- return *this;
-}
-
-using glBuffer = glBuffers<1>;
-
-#endif
diff --git a/lib/glVertexArrays.cpp b/lib/glVertexArrays.cpp
deleted file mode 100644
index 372b49b..0000000
--- a/lib/glVertexArrays.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "glVertexArrays.h"
-
-void
-glVertexArraysBase::gen(GLsizei n, GLuint * ids)
-{
- glGenVertexArrays(n, ids);
-}
-
-void
-glVertexArraysBase::del(GLsizei n, const GLuint * ids)
-{
- glDeleteVertexArrays(n, ids);
-}
diff --git a/lib/glVertexArrays.h b/lib/glVertexArrays.h
deleted file mode 100644
index 803206a..0000000
--- a/lib/glVertexArrays.h
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef GLVERTEXARRAYS_H
-#define GLVERTEXARRAYS_H
-
-#include <GL/glew.h>
-#include <algorithm> // IWYU pragma: keep
-#include <array>
-#include <cstddef>
-#include <special_members.hpp>
-
-class glVertexArraysBase {
-protected:
- static void gen(GLsizei, GLuint *);
- static void del(GLsizei, const GLuint *);
-};
-
-template<size_t N> class glVertexArrays : glVertexArraysBase {
-public:
- glVertexArrays()
- {
- gen(N, ids.data());
- }
-
- ~glVertexArrays()
- {
- del(N, ids.data());
- }
-
- NO_COPY(glVertexArrays);
- CUSTOM_MOVE(glVertexArrays);
-
- // NOLINTNEXTLINE(hicpp-explicit-conversions)
- operator GLuint() const
- {
- static_assert(N == 1, "Implicit cast only if N == 1");
- return ids.front();
- }
-
- auto
- operator[](size_t n) const
- {
- return ids[n];
- }
-
-private:
- std::array<GLuint, N> ids {};
-};
-
-template<size_t N> glVertexArrays<N>::glVertexArrays(glVertexArrays<N> && src) noexcept : ids {src.ids}
-{
- std::fill(src.ids.begin(), src.ids.end(), -1);
-}
-
-template<size_t N>
-glVertexArrays<N> &
-glVertexArrays<N>::operator=(glVertexArrays<N> && src) noexcept
-{
- ids = src.ids;
- std::fill(src.ids.begin(), src.ids.end(), -1);
- return *this;
-}
-
-using glVertexArray = glVertexArrays<1>;
-
-#endif