/* * Copyright Andrey Semashev 2007 - 2015. * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) */ /*! * \file attribute_value_impl.hpp * \author Andrey Semashev * \date 24.06.2007 * * The header contains an implementation of a basic attribute value implementation class. */ #ifndef BOOST_LOG_ATTRIBUTES_ATTRIBUTE_VALUE_IMPL_HPP_INCLUDED_ #define BOOST_LOG_ATTRIBUTES_ATTRIBUTE_VALUE_IMPL_HPP_INCLUDED_ #include #include #include #include #include #include #include #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) #include #endif #include #ifdef BOOST_HAS_PRAGMA_ONCE #pragma once #endif namespace boost { BOOST_LOG_OPEN_NAMESPACE namespace attributes { /*! * \brief Basic attribute value implementation class * * This class can be used as a boilerplate for simple attribute values. The class implements all needed * interfaces of attribute values and allows to store a single value of the type specified as a template parameter. * The stored value can be dispatched with type dispatching mechanism. */ template< typename T > class attribute_value_impl : public attribute_value::impl { public: //! Value type typedef T value_type; private: //! Attribute value const value_type m_value; public: /*! * Constructor with initialization of the stored value */ explicit attribute_value_impl(value_type const& v) : m_value(v) {} /*! * Constructor with initialization of the stored value */ explicit attribute_value_impl(BOOST_RV_REF(value_type) v) : m_value(v) {} /*! * Attribute value dispatching method. * * \param dispatcher The dispatcher that receives the stored value * * \return \c true if the value has been dispatched, \c false otherwise */ virtual bool dispatch(type_dispatcher& dispatcher) { type_dispatcher::callback< value_type > callback = dispatcher.get_callback< value_type >(); if (callback) { callback(m_value); return true; } else return false; } /*! * \return The attribute value type */ typeindex::type_index get_type() const { return typeindex::type_id< value_type >(); } /*! * \return Reference to the contained value. */ value_type const& get() const { return m_value; } }; /*! * The function creates an attribute value from the specified object. */ #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) template< typename T > inline attribute_value make_attribute_value(T&& v) { typedef typename remove_cv< typename remove_reference< T >::type >::type value_type; return attribute_value(new attribute_value_impl< value_type >(boost::forward< T >(v))); } #else // !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) template< typename T > inline attribute_value make_attribute_value(T const& v) { typedef typename remove_cv< T >::type value_type; return attribute_value(new attribute_value_impl< value_type >(v)); } template< typename T > inline attribute_value make_attribute_value(rv< T > const& v) { typedef typename remove_cv< T >::type value_type; return attribute_value(new attribute_value_impl< value_type >(v)); } #endif // !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) } // namespace attributes BOOST_LOG_CLOSE_NAMESPACE // namespace log } // namespace boost #include #endif // BOOST_LOG_ATTRIBUTES_ATTRIBUTE_VALUE_IMPL_HPP_INCLUDED_