summaryrefslogtreecommitdiff
path: root/boost/log/attributes/attribute_name.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/log/attributes/attribute_name.hpp')
-rw-r--r--boost/log/attributes/attribute_name.hpp185
1 files changed, 185 insertions, 0 deletions
diff --git a/boost/log/attributes/attribute_name.hpp b/boost/log/attributes/attribute_name.hpp
new file mode 100644
index 0000000000..4e283e6a28
--- /dev/null
+++ b/boost/log/attributes/attribute_name.hpp
@@ -0,0 +1,185 @@
+/*
+ * Copyright Andrey Semashev 2007 - 2014.
+ * 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_name.hpp
+ * \author Andrey Semashev
+ * \date 28.06.2010
+ *
+ * The header contains attribute name interface definition.
+ */
+
+#ifndef BOOST_LOG_ATTRIBUTE_NAME_HPP_INCLUDED_
+#define BOOST_LOG_ATTRIBUTE_NAME_HPP_INCLUDED_
+
+#include <iosfwd>
+#include <string>
+#include <boost/assert.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/log/detail/config.hpp>
+#include <boost/utility/explicit_operator_bool.hpp>
+#include <boost/log/detail/header.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+
+BOOST_LOG_OPEN_NAMESPACE
+
+/*!
+ * \brief The class represents an attribute name in containers used by the library
+ *
+ * The class mostly serves for optimization purposes. Each attribute name that is used
+ * with the library is automatically associated with a unique identifier, which is much
+ * lighter in terms of memory footprint and operations complexity. This is done
+ * transparently by this class, on object construction. Passing objects of this class
+ * to other library methods, such as attribute lookup functions, will not require
+ * this translation and/or string copying and thus will result in a more efficient code.
+ */
+class attribute_name
+{
+public:
+ //! String type
+ typedef std::string string_type;
+#ifdef BOOST_LOG_DOXYGEN_PASS
+ //! Associated identifier
+ typedef unspecified id_type;
+#else
+ typedef uint32_t id_type;
+
+private:
+ enum { uninitialized = 0xFFFFFFFFu };
+
+ class repository;
+ friend class repository;
+
+private:
+ //! Associated identifier
+ id_type m_id;
+#endif
+
+public:
+ /*!
+ * Default constructor. Creates an object that does not refer to any attribute name.
+ */
+ BOOST_CONSTEXPR attribute_name() BOOST_NOEXCEPT : m_id(static_cast< id_type >(uninitialized))
+ {
+ }
+ /*!
+ * Constructs an attribute name from the specified string
+ *
+ * \param name An attribute name
+ * \pre \a name is not NULL and points to a zero-terminated string
+ */
+ attribute_name(const char* name) :
+ m_id(get_id_from_string(name))
+ {
+ }
+ /*!
+ * Constructs an attribute name from the specified string
+ *
+ * \param name An attribute name
+ */
+ attribute_name(string_type const& name) :
+ m_id(get_id_from_string(name.c_str()))
+ {
+ }
+
+ /*!
+ * Compares the attribute names
+ *
+ * \return \c true if <tt>*this</tt> and \c that refer to the same attribute name,
+ * and \c false otherwise.
+ */
+ bool operator== (attribute_name const& that) const BOOST_NOEXCEPT { return m_id == that.m_id; }
+ /*!
+ * Compares the attribute names
+ *
+ * \return \c true if <tt>*this</tt> and \c that refer to different attribute names,
+ * and \c false otherwise.
+ */
+ bool operator!= (attribute_name const& that) const BOOST_NOEXCEPT { return m_id != that.m_id; }
+
+ /*!
+ * Compares the attribute names
+ *
+ * \return \c true if <tt>*this</tt> and \c that refer to the same attribute name,
+ * and \c false otherwise.
+ */
+ bool operator== (const char* that) const { return (m_id != static_cast< id_type >(uninitialized)) && (this->string() == that); }
+ /*!
+ * Compares the attribute names
+ *
+ * \return \c true if <tt>*this</tt> and \c that refer to different attribute names,
+ * and \c false otherwise.
+ */
+ bool operator!= (const char* that) const { return !operator== (that); }
+
+ /*!
+ * Compares the attribute names
+ *
+ * \return \c true if <tt>*this</tt> and \c that refer to the same attribute name,
+ * and \c false otherwise.
+ */
+ bool operator== (string_type const& that) const { return (m_id != static_cast< id_type >(uninitialized)) && (this->string() == that); }
+ /*!
+ * Compares the attribute names
+ *
+ * \return \c true if <tt>*this</tt> and \c that refer to different attribute names,
+ * and \c false otherwise.
+ */
+ bool operator!= (string_type const& that) const { return !operator== (that); }
+
+ /*!
+ * Checks if the object was default-constructed
+ *
+ * \return \c true if <tt>*this</tt> was constructed with an attribute name, \c false otherwise
+ */
+ BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT()
+ /*!
+ * Checks if the object was default-constructed
+ *
+ * \return \c true if <tt>*this</tt> was default-constructed and does not refer to any attribute name,
+ * \c false otherwise
+ */
+ bool operator! () const BOOST_NOEXCEPT { return (m_id == static_cast< id_type >(uninitialized)); }
+
+ /*!
+ * \return The associated id value
+ * \pre <tt>(!*this) == false</tt>
+ */
+ id_type id() const BOOST_NOEXCEPT
+ {
+ BOOST_ASSERT(m_id != static_cast< id_type >(uninitialized));
+ return m_id;
+ }
+ /*!
+ * \return The attribute name string that was used during the object construction
+ * \pre <tt>(!*this) == false</tt>
+ */
+ string_type const& string() const { return get_string_from_id(m_id); }
+
+private:
+#ifndef BOOST_LOG_DOXYGEN_PASS
+ static BOOST_LOG_API id_type get_id_from_string(const char* name);
+ static BOOST_LOG_API string_type const& get_string_from_id(id_type id);
+#endif
+};
+
+template< typename CharT, typename TraitsT >
+BOOST_LOG_API std::basic_ostream< CharT, TraitsT >& operator<< (
+ std::basic_ostream< CharT, TraitsT >& strm,
+ attribute_name const& name);
+
+BOOST_LOG_CLOSE_NAMESPACE // namespace log
+
+} // namespace boost
+
+#include <boost/log/detail/footer.hpp>
+
+#endif // BOOST_LOG_ATTRIBUTE_NAME_HPP_INCLUDED_