colour: add type_name specialisation

This commit is contained in:
Danny Robson 2016-08-13 21:03:39 +10:00
parent bc8cac0e1e
commit 94ef217778
2 changed files with 41 additions and 6 deletions

View File

@ -440,14 +440,38 @@ util::operator>> (std::istream &is, util::colour<S,T> &c)
template std::istream& util::operator>> (std::istream&, util::colour<3,uint8_t>&);
///////////////////////////////////////////////////////////////////////////////
#define INSTANTIATE_S_T(S,T) \
template struct util::colour<S,T>; \
template std::ostream& util::operator<< (std::ostream&, util::colour<S,T>);
// we need to instantiate the various type_name specialisations for colour.
//
// we provide a declaration here, before then instantiating a routine that we
// know will cause an implicit instantiation (ie util::to_string) for each
// colour specialisation we require.
template <size_t S, typename T>
constexpr
const char util::type_name<colour<S,T>>::value[];
//-----------------------------------------------------------------------------
#define INSTANTIATE_S_T(S,T) \
template \
struct util::colour<S,T>; \
\
template \
std::ostream& \
util::operator<< (std::ostream&, util::colour<S,T>); \
\
template \
const char* \
util::to_string<util::colour<S,T>> (void);
//-----------------------------------------------------------------------------
#define INSTANTIATE_S(S) \
INSTANTIATE_S_T(S,uint8_t) \
INSTANTIATE_S_T(S,float) \
INSTANTIATE_S_T(S,double)
//-----------------------------------------------------------------------------
INSTANTIATE_S(1)
INSTANTIATE_S(3)
INSTANTIATE_S(4)

View File

@ -18,6 +18,7 @@
#define __UTIL_COLOUR_HPP
#include "coord.hpp"
#include "introspection.hpp"
#include <ostream>
@ -48,6 +49,7 @@ namespace util {
template <typename T> using colour3 = colour<3,T>;
template <typename T> using colour4 = colour<4,T>;
typedef colour3<uint8_t> colour1u;
typedef colour3<uint8_t> colour3u;
typedef colour4<uint8_t> colour4u;
@ -55,15 +57,24 @@ namespace util {
typedef colour3<float> colour3f;
typedef colour4<float> colour4f;
// RGB <-> HSV
// RGB/HSV conversions
colour3f rgb_to_hsv (colour3f);
colour3f hsv_to_rgb (colour3f);
// ostream/istream operators
template <size_t S, typename T>
std::ostream& operator<< (std::ostream&, util::colour<S,T>);
std::ostream&
operator<< (std::ostream&, util::colour<S,T>);
template <size_t S, typename T>
std::istream& operator>> (std::istream&, util::colour<S,T>&);
std::istream&
operator>> (std::istream&, util::colour<S,T>&);
// type name introspection specialisation
template <size_t S, typename T>
struct type_name<colour<S,T>> {
static constexpr const char value[] = "colour";
};
}
#include "colour.ipp"