summaryrefslogtreecommitdiff
path: root/boost/log/attributes/attribute_cast.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/log/attributes/attribute_cast.hpp')
-rw-r--r--boost/log/attributes/attribute_cast.hpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/boost/log/attributes/attribute_cast.hpp b/boost/log/attributes/attribute_cast.hpp
new file mode 100644
index 0000000000..7ae1c92cf4
--- /dev/null
+++ b/boost/log/attributes/attribute_cast.hpp
@@ -0,0 +1,74 @@
+/*
+ * 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_cast.hpp
+ * \author Andrey Semashev
+ * \date 06.08.2010
+ *
+ * The header contains utilities for casting between attribute factories.
+ */
+
+#ifndef BOOST_LOG_ATTRIBUTES_ATTRIBUTE_CAST_HPP_INCLUDED_
+#define BOOST_LOG_ATTRIBUTES_ATTRIBUTE_CAST_HPP_INCLUDED_
+
+#include <boost/log/detail/config.hpp>
+#include <boost/log/attributes/attribute.hpp>
+#include <boost/log/detail/header.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+
+BOOST_LOG_OPEN_NAMESPACE
+
+namespace attributes {
+
+/*!
+ * The class holds a reference to the attribute factory implementation being casted
+ */
+class cast_source
+{
+private:
+ attribute::impl* m_pImpl;
+
+public:
+ /*!
+ * Initializing constructor. Creates a source that refers to the specified factory implementation.
+ */
+ explicit cast_source(attribute::impl* p) : m_pImpl(p)
+ {
+ }
+
+ /*!
+ * The function attempts to cast the aggregated pointer to the implementation to the specified type.
+ *
+ * \return The converted pointer or \c NULL, if the conversion fails.
+ */
+ template< typename T >
+ T* as() const { return dynamic_cast< T* >(m_pImpl); }
+};
+
+} // namespace attributes
+
+/*!
+ * The function casts one attribute factory to another
+ */
+template< typename T >
+inline T attribute_cast(attribute const& attr)
+{
+ return T(attributes::cast_source(attr.get_impl()));
+}
+
+BOOST_LOG_CLOSE_NAMESPACE // namespace log
+
+} // namespace boost
+
+#include <boost/log/detail/footer.hpp>
+
+#endif // BOOST_LOG_ATTRIBUTES_ATTRIBUTE_CAST_HPP_INCLUDED_