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 attribute_name.hpp
9 * \author Andrey Semashev
10 * \date 28.06.2010
11 *
12 * The header contains attribute name interface definition.
13 */
14
15#ifndef BOOST_LOG_ATTRIBUTE_NAME_HPP_INCLUDED_
16#define BOOST_LOG_ATTRIBUTE_NAME_HPP_INCLUDED_
17
18#include <iosfwd>
19#include <string>
20#include <boost/assert.hpp>
21#include <boost/cstdint.hpp>
22#include <boost/core/explicit_operator_bool.hpp>
23#include <boost/log/detail/config.hpp>
24#include <boost/log/detail/header.hpp>
25
26#ifdef BOOST_HAS_PRAGMA_ONCE
27#pragma once
28#endif
29
30namespace boost {
31
32BOOST_LOG_OPEN_NAMESPACE
33
34/*!
35 * \brief The class represents an attribute name in containers used by the library
36 *
37 * The class mostly serves for optimization purposes. Each attribute name that is used
38 * with the library is automatically associated with a unique identifier, which is much
39 * lighter in terms of memory footprint and operations complexity. This is done
40 * transparently by this class, on object construction. Passing objects of this class
41 * to other library methods, such as attribute lookup functions, will not require
42 * this translation and/or string copying and thus will result in a more efficient code.
43 */
44class attribute_name
45{
46public:
47 //! String type
48 typedef std::string string_type;
49#ifdef BOOST_LOG_DOXYGEN_PASS
50 //! Associated identifier
51 typedef unspecified id_type;
52#else
53 typedef uint32_t id_type;
54
55private:
56 class repository;
57 friend class repository;
58
59private:
60 //! Associated identifier
61 id_type m_id;
62 //! A special identifier value indicating unassigned attribute name
63 static BOOST_CONSTEXPR_OR_CONST id_type uninitialized = ~static_cast< id_type >(0u);
64#endif
65
66public:
67 /*!
68 * Default constructor. Creates an object that does not refer to any attribute name.
69 */
70 BOOST_CONSTEXPR attribute_name() BOOST_NOEXCEPT : m_id(uninitialized)
71 {
72 }
73 /*!
74 * Constructs an attribute name from the specified string
75 *
76 * \param name An attribute name
77 * \pre \a name is not NULL and points to a zero-terminated string
78 */
79 attribute_name(const char* name) :
80 m_id(get_id_from_string(name))
81 {
82 }
83 /*!
84 * Constructs an attribute name from the specified string
85 *
86 * \param name An attribute name
87 */
88 attribute_name(string_type const& name) :
89 m_id(get_id_from_string(name: name.c_str()))
90 {
91 }
92
93 /*!
94 * Compares the attribute names
95 *
96 * \return \c true if <tt>*this</tt> and \c that refer to the same attribute name,
97 * and \c false otherwise.
98 */
99 bool operator== (attribute_name const& that) const BOOST_NOEXCEPT { return m_id == that.m_id; }
100 /*!
101 * Compares the attribute names
102 *
103 * \return \c true if <tt>*this</tt> and \c that refer to different attribute names,
104 * and \c false otherwise.
105 */
106 bool operator!= (attribute_name const& that) const BOOST_NOEXCEPT { return m_id != that.m_id; }
107
108 /*!
109 * Compares the attribute names
110 *
111 * \return \c true if <tt>*this</tt> and \c that refer to the same attribute name,
112 * and \c false otherwise.
113 */
114 bool operator== (const char* that) const { return (m_id != uninitialized) && (this->string() == that); }
115 /*!
116 * Compares the attribute names
117 *
118 * \return \c true if <tt>*this</tt> and \c that refer to different attribute names,
119 * and \c false otherwise.
120 */
121 bool operator!= (const char* that) const { return !operator== (that); }
122
123 /*!
124 * Compares the attribute names
125 *
126 * \return \c true if <tt>*this</tt> and \c that refer to the same attribute name,
127 * and \c false otherwise.
128 */
129 bool operator== (string_type const& that) const { return (m_id != uninitialized) && (this->string() == that); }
130 /*!
131 * Compares the attribute names
132 *
133 * \return \c true if <tt>*this</tt> and \c that refer to different attribute names,
134 * and \c false otherwise.
135 */
136 bool operator!= (string_type const& that) const { return !operator== (that); }
137
138 /*!
139 * Checks if the object was default-constructed
140 *
141 * \return \c true if <tt>*this</tt> was constructed with an attribute name, \c false otherwise
142 */
143 BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT()
144 /*!
145 * Checks if the object was default-constructed
146 *
147 * \return \c true if <tt>*this</tt> was default-constructed and does not refer to any attribute name,
148 * \c false otherwise
149 */
150 bool operator! () const BOOST_NOEXCEPT { return (m_id == uninitialized); }
151
152 /*!
153 * \return The associated id value
154 * \pre <tt>(!*this) == false</tt>
155 */
156 id_type id() const BOOST_NOEXCEPT
157 {
158 BOOST_ASSERT(m_id != uninitialized);
159 return m_id;
160 }
161 /*!
162 * \return The attribute name string that was used during the object construction
163 * \pre <tt>(!*this) == false</tt>
164 */
165 string_type const& string() const { return get_string_from_id(id: m_id); }
166
167private:
168#ifndef BOOST_LOG_DOXYGEN_PASS
169 static BOOST_LOG_API id_type get_id_from_string(const char* name);
170 static BOOST_LOG_API string_type const& get_string_from_id(id_type id);
171#endif
172};
173
174template< typename CharT, typename TraitsT >
175BOOST_LOG_API std::basic_ostream< CharT, TraitsT >& operator<< (
176 std::basic_ostream< CharT, TraitsT >& strm,
177 attribute_name const& name);
178
179BOOST_LOG_CLOSE_NAMESPACE // namespace log
180
181} // namespace boost
182
183#include <boost/log/detail/footer.hpp>
184
185#endif // BOOST_LOG_ATTRIBUTE_NAME_HPP_INCLUDED_
186

source code of boost/libs/log/include/boost/log/attributes/attribute_name.hpp