1 /* 2 * Copyright Andrey Semashev 2007 - 2015. 3 * Distributed under the Boost Software License, Version 1.0. 4 * (See accompanying file LICENSE_1_0.txt or copy at 5 * http://www.boost.org/LICENSE_1_0.txt) 6 */ 7 /*! 8 * \file constant.hpp 9 * \author Andrey Semashev 10 * \date 15.04.2007 11 * 12 * The header contains implementation of a constant attribute. 13 */ 14 15 #ifndef BOOST_LOG_ATTRIBUTES_CONSTANT_HPP_INCLUDED_ 16 #define BOOST_LOG_ATTRIBUTES_CONSTANT_HPP_INCLUDED_ 17 18 #include <boost/move/core.hpp> 19 #include <boost/move/utility.hpp> 20 #include <boost/type_traits/remove_reference.hpp> 21 #include <boost/log/detail/config.hpp> 22 #include <boost/log/detail/embedded_string_type.hpp> 23 #include <boost/log/attributes/attribute.hpp> 24 #include <boost/log/attributes/attribute_cast.hpp> 25 #include <boost/log/attributes/attribute_value_impl.hpp> 26 #include <boost/log/detail/header.hpp> 27 28 #ifdef BOOST_HAS_PRAGMA_ONCE 29 #pragma once 30 #endif 31 32 namespace boost { 33 34 BOOST_LOG_OPEN_NAMESPACE 35 36 namespace attributes { 37 38 /*! 39 * \brief A class of an attribute that holds a single constant value 40 * 41 * The constant is a simplest and one of the most frequently used types of attributes. 42 * It stores a constant value, which it eventually returns as its value each time 43 * requested. 44 */ 45 template< typename T > 46 class constant : 47 public attribute 48 { 49 public: 50 //! Attribute value type 51 typedef T value_type; 52 53 protected: 54 //! Factory implementation 55 class BOOST_SYMBOL_VISIBLE impl : 56 public attribute_value_impl< value_type > 57 { 58 //! Base type 59 typedef attribute_value_impl< value_type > base_type; 60 61 public: 62 /*! 63 * Constructor with the stored value initialization 64 */ impl(value_type const & value)65 explicit impl(value_type const& value) : base_type(value) {} 66 /*! 67 * Constructor with the stored value initialization 68 */ impl(BOOST_RV_REF (value_type)value)69 explicit impl(BOOST_RV_REF(value_type) value) : base_type(boost::move(value)) {} 70 }; 71 72 public: 73 /*! 74 * Constructor with the stored value initialization 75 */ constant(value_type const & value)76 explicit constant(value_type const& value) : attribute(new impl(value)) {} 77 /*! 78 * Constructor with the stored value initialization 79 */ constant(BOOST_RV_REF (value_type)value)80 explicit constant(BOOST_RV_REF(value_type) value) : attribute(new impl(boost::move(value))) {} 81 /*! 82 * Constructor for casting support 83 */ constant(cast_source const & source)84 explicit constant(cast_source const& source) : attribute(source.as< impl >()) 85 { 86 } 87 88 /*! 89 * \return Reference to the contained value. 90 */ get() const91 value_type const& get() const 92 { 93 return static_cast< impl* >(this->get_impl())->get(); 94 } 95 }; 96 97 /*! 98 * The function constructs a \c constant attribute containing the provided value. 99 * The function automatically converts C string arguments to \c std::basic_string objects. 100 */ 101 template< typename T > 102 inline constant< 103 typename boost::log::aux::make_embedded_string_type< 104 typename remove_reference< T >::type 105 >::type make_constant(BOOST_FWD_REF (T)val)106> make_constant(BOOST_FWD_REF(T) val) 107 { 108 typedef typename boost::log::aux::make_embedded_string_type< 109 typename remove_reference< T >::type 110 >::type value_type; 111 return constant< value_type >(boost::forward< T >(val)); 112 } 113 114 } // namespace attributes 115 116 BOOST_LOG_CLOSE_NAMESPACE // namespace log 117 118 } // namespace boost 119 120 #include <boost/log/detail/footer.hpp> 121 122 #endif // BOOST_LOG_ATTRIBUTES_CONSTANT_HPP_INCLUDED_ 123