186 lines
5.8 KiB
C++
186 lines
5.8 KiB
C++
/*
|
|
* 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_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_
|