src/gltexturend.cpp
694871da
 #include <gltexturend.hpp>
 
 #include <functional>
 #include <numeric>
 #include <utility>
 
 #include <globject.hpp>
 #include <gltexture.hpp>
 
 // NOLINTNEXTLINE
 #define STR_EXCEPTION GLObject<>::Exception
 #include <str.hpp>
 
 
 /// Special member functions
 
 
 template<std::size_t N>
 inline GLTextureND<N>::GLTextureND(
     // NOLINTNEXTLINE
     std::string object_label,
     GLenum      target,
     GLenum      binding,
     GLenum      size_max_name,
     Size        size,
     GLenum      internal_format,
     GLenum      wrap,
     GLenum      min_filter,
     GLenum      mag_filter
 )
 :
     GLTexture(
         STR_JOIN(" ", it, it, {
             str_size_(size),
             std::move(object_label)
         }),
         target,
         binding,
         internal_format,
         wrap,
         min_filter,
         mag_filter
     ),
     size_{size}
 {
     check_size_max_(size_max_name);
 }
 
 
 /// Core
 
 
 template<std::size_t N>
 std::size_t GLTextureND<N>::data_size_() const
 {
     return std::accumulate(
         size_.begin(),
         size_.end(),
         std::size_t{1},
         std::multiplies<std::size_t>{}
     );
 }
 
 
 /// Check
 
 
 template<std::size_t N>
 void GLTextureND<N>::check_size_max_(GLenum size_max_name)
 {
     auto static const size_max = integer(size_max_name);
     for (auto size : size_)
         if (size > size_max)
             STR_THROW(
                 "Expected max size " << size_max         << ", " <<
                 "got "               << str_size_(size_) << "."
             );
 }
 
 
 /// String
 
 
 template<std::size_t N>
 std::string GLTextureND<N>::str_size_(Size size)
 {
     return STR("{" << STR_JOIN(", ", it, it, size) << "}");
 }
 
 
 /// Explicit template instantiation
 
 
 template class GLTextureND<1>;
 template class GLTextureND<2>;
 template class GLTextureND<3>;