Make Property use boost::variant

This commit is contained in:
Andrzej Rybczak
2017-01-28 17:43:16 +01:00
parent b2f29c6756
commit 0b1f0bfe0d

View File

@@ -22,6 +22,7 @@
#define NCMPCPP_STRBUFFER_H #define NCMPCPP_STRBUFFER_H
#include <boost/lexical_cast.hpp> #include <boost/lexical_cast.hpp>
#include <boost/variant.hpp>
#include <map> #include <map>
#include "window.h" #include "window.h"
@@ -33,34 +34,21 @@ template <typename CharT> class BasicBuffer
{ {
struct Property struct Property
{ {
enum class Type { Color, Format }; template <typename ArgT>
Property(ArgT &&arg, size_t id_)
Property(NC::Color color_, size_t id_) : m_impl(std::forward<ArgT>(arg)), m_id(id_) { }
: m_type(Type::Color), m_color(std::move(color_)), m_id(id_) { }
Property(NC::Format format_, size_t id_)
: m_type(Type::Format), m_format(format_), m_id(id_) { }
size_t id() const { return m_id; } size_t id() const { return m_id; }
template <typename OutputStreamT> template <typename OutputStreamT>
friend OutputStreamT &operator<<(OutputStreamT &os, const Property &p) friend OutputStreamT &operator<<(OutputStreamT &os, const Property &p)
{ {
switch (p.m_type) boost::apply_visitor([&os](const auto &v) { os << v; }, p.m_impl);
{
case Type::Color:
os << p.m_color;
break;
case Type::Format:
os << p.m_format;
break;
}
return os; return os;
} }
private: private:
Type m_type; boost::variant<Color, Format> m_impl;
Color m_color;
Format m_format;
size_t m_id; size_t m_id;
}; };