From ccc21b2ae8858c32a8a62b2fa16c1a96f7f6e679 Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Tue, 13 Jan 2015 18:33:02 +1100 Subject: [PATCH] colour: derive from detail::coord --- colour.cpp | 49 +++++++++++++++++++++++++++++++++---------------- colour.hpp | 21 ++++++++++++++------- 2 files changed, 47 insertions(+), 23 deletions(-) diff --git a/colour.cpp b/colour.cpp index a8a2c3c0..9c612c08 100644 --- a/colour.cpp +++ b/colour.cpp @@ -28,21 +28,33 @@ using namespace util; //----------------------------------------------------------------------------- -const util::colour util::colour::WHITE ({ 1.f, 1.f, 1.f, 1.f }); -const util::colour util::colour::BLACK ({ 0.f, 0.f, 0.f, 1.f }); +template +const util::colour +util::colour::WHITE (1.f, 1.f, 1.f, 1.f); -const util::colour util::colour::RED ({ 1.f, 0.f, 0.f, 1.f }); -const util::colour util::colour::GREEN ({ 0.f, 1.f, 0.f, 1.f }); -const util::colour util::colour::BLUE ({ 0.f, 0.f, 1.f, 1.f }); +template +const util::colour +util::colour::BLACK (0.f, 0.f, 0.f, 1.f); + +template +const util::colour +util::colour::RED (1.f, 0.f, 0.f, 1.f); + +template +const util::colour +util::colour::GREEN (0.f, 1.f, 0.f, 1.f); + +template +const util::colour +util::colour::BLUE (0.f, 0.f, 1.f, 1.f); -//----------------------------------------------------------------------------- //! Extract a colour object from a JSON node. //! //! Data must be an array or 3 or 4 numbers. Guarantees success, or throws a //! json::type_error. const json::node& -operator>> (const json::node &node, colour &c) { +operator>> (const json::node &node, colour4f &c) { c.r = static_cast (node[0].as_number ()); c.g = static_cast (node[1].as_number ()); c.b = static_cast (node[2].as_number ()); @@ -60,24 +72,29 @@ operator>> (const json::node &node, colour &c) { //----------------------------------------------------------------------------- namespace util { template<> - colour + colour4f random (void) { - return colour ({ range::UNIT.random (), - range::UNIT.random (), - range::UNIT.random (), - range::UNIT.random () }); + return colour4f ({ range::UNIT.random (), + range::UNIT.random (), + range::UNIT.random (), + range::UNIT.random () }); } template <> - colour& - randomise (colour &c) - { return c = random (); } + colour4f& + randomise (colour4f &c) + { return c = random (); } } //----------------------------------------------------------------------------- std::ostream& -util::operator<< (std::ostream &os, const util::colour &c) { +util::operator<< (std::ostream &os, const util::colour4f &c) { os << "colour(" << c.r << ", " << c.g << ", " << c.b << ", " << c.a << ")"; return os; } + + +//----------------------------------------------------------------------------- +template struct util::colour; +template struct util::colour; diff --git a/colour.hpp b/colour.hpp index 37ab846e..c9802eee 100644 --- a/colour.hpp +++ b/colour.hpp @@ -20,17 +20,22 @@ #ifndef __UTIL_COLOUR_HPP #define __UTIL_COLOUR_HPP +#include "detail/coord.hpp" + #include "json.hpp" #include namespace util { /// An RGBA colour POD type. - struct colour { - float r; - float g; - float b; - float a; + template + struct colour : public detail::coord<4, T> { + using detail::coord<4,T>::coord; + + T r; + T g; + T b; + T a; static const colour WHITE; static const colour BLACK; @@ -39,8 +44,10 @@ namespace util { static const colour GREEN; }; - std::ostream& operator<< (std::ostream&, const util::colour&); - const json::node& operator>> (const json::node&, util::colour&); + typedef colour colour4f; + + const json::node& operator>> (const json::node&, util::colour4f&); + std::ostream& operator<< (std::ostream&, const util::colour4f&); } #endif