summaryrefslogtreecommitdiff
path: root/boost/log/detail/tagged_integer.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/log/detail/tagged_integer.hpp')
-rw-r--r--boost/log/detail/tagged_integer.hpp147
1 files changed, 147 insertions, 0 deletions
diff --git a/boost/log/detail/tagged_integer.hpp b/boost/log/detail/tagged_integer.hpp
new file mode 100644
index 0000000000..5aef5bbfcc
--- /dev/null
+++ b/boost/log/detail/tagged_integer.hpp
@@ -0,0 +1,147 @@
+/*
+ * 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 tagged_integer.hpp
+ * \author Andrey Semashev
+ * \date 11.01.2008
+ *
+ * \brief This header is the Boost.Log library implementation, see the library documentation
+ * at http://www.boost.org/doc/libs/release/libs/log/doc/html/index.html.
+ */
+
+#ifndef BOOST_LOG_TAGGED_INTEGER_HPP_INCLUDED_
+#define BOOST_LOG_TAGGED_INTEGER_HPP_INCLUDED_
+
+#include <boost/log/detail/config.hpp>
+#include <boost/log/detail/header.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+
+BOOST_LOG_OPEN_NAMESPACE
+
+namespace aux {
+
+//! A tagged integer wrapper for type safety
+template< typename IntT, typename TagT >
+struct tagged_integer
+{
+ //! Contained value type
+ typedef IntT integer_type;
+ //! Tag
+ typedef TagT tag;
+
+ //! Contained value
+ integer_type value;
+
+ //! Conversion operator
+ operator integer_type() const { return value; }
+
+ // Increment
+ tagged_integer& operator++ () { ++value; return *this; }
+ tagged_integer operator++ (int) { tagged_integer temp = *this; ++value; return temp; }
+ // Decrement
+ tagged_integer& operator-- () { --value; return *this; }
+ tagged_integer operator-- (int) { tagged_integer temp = *this; --value; return temp; }
+
+#define BOOST_LOG_TAGGED_INTEGER_OP(op)\
+ tagged_integer& operator op (tagged_integer const& that) { value op that.value; return *this; }
+
+ BOOST_LOG_TAGGED_INTEGER_OP(|=)
+ BOOST_LOG_TAGGED_INTEGER_OP(&=)
+ BOOST_LOG_TAGGED_INTEGER_OP(^=)
+ BOOST_LOG_TAGGED_INTEGER_OP(+=)
+ BOOST_LOG_TAGGED_INTEGER_OP(-=)
+ BOOST_LOG_TAGGED_INTEGER_OP(*=)
+ BOOST_LOG_TAGGED_INTEGER_OP(/=)
+ BOOST_LOG_TAGGED_INTEGER_OP(%=)
+
+#undef BOOST_LOG_TAGGED_INTEGER_OP
+
+ //! Inversion operator
+ tagged_integer& operator~ () { ~value; return *this; }
+
+ // Shift operators
+ template< typename T >
+ tagged_integer& operator<<= (T const& that) { value <<= that; return *this; }
+ template< typename T >
+ tagged_integer& operator>>= (T const& that) { value >>= that; return *this; }
+
+private:
+ // Protection against improper usage
+ template< typename T1, typename T2 >
+ tagged_integer& operator<<= (tagged_integer< T1, T2 > const&);
+ template< typename T1, typename T2 >
+ tagged_integer& operator>>= (tagged_integer< T1, T2 > const&);
+};
+
+ // Relational operators
+#define BOOST_LOG_TAGGED_INTEGER_OP(op)\
+ template< typename IntT, typename TagT >\
+ inline bool operator op (\
+ tagged_integer< IntT, TagT > const& left, tagged_integer< IntT, TagT > const& right)\
+ {\
+ return (left.value op right.value);\
+ }
+
+BOOST_LOG_TAGGED_INTEGER_OP(==)
+BOOST_LOG_TAGGED_INTEGER_OP(!=)
+BOOST_LOG_TAGGED_INTEGER_OP(<)
+BOOST_LOG_TAGGED_INTEGER_OP(>)
+BOOST_LOG_TAGGED_INTEGER_OP(<=)
+BOOST_LOG_TAGGED_INTEGER_OP(>=)
+
+#undef BOOST_LOG_TAGGED_INTEGER_OP
+
+#define BOOST_LOG_TAGGED_INTEGER_OP(op)\
+ template< typename IntT, typename TagT >\
+ inline tagged_integer< IntT, TagT > operator op (\
+ tagged_integer< IntT, TagT > const& left, tagged_integer< IntT, TagT > const& right)\
+ {\
+ tagged_integer< IntT, TagT > temp = left;\
+ temp op##= right;\
+ return temp;\
+ }
+
+BOOST_LOG_TAGGED_INTEGER_OP(|)
+BOOST_LOG_TAGGED_INTEGER_OP(&)
+BOOST_LOG_TAGGED_INTEGER_OP(^)
+BOOST_LOG_TAGGED_INTEGER_OP(+)
+BOOST_LOG_TAGGED_INTEGER_OP(-)
+BOOST_LOG_TAGGED_INTEGER_OP(*)
+BOOST_LOG_TAGGED_INTEGER_OP(/)
+BOOST_LOG_TAGGED_INTEGER_OP(%)
+
+#undef BOOST_LOG_TAGGED_INTEGER_OP
+
+#define BOOST_LOG_TAGGED_INTEGER_OP(op)\
+ template< typename IntT, typename TagT, typename T >\
+ inline tagged_integer< IntT, TagT > operator op (\
+ tagged_integer< IntT, TagT > const& left, T const& right)\
+ {\
+ tagged_integer< IntT, TagT > temp = left;\
+ temp op##= right;\
+ return temp;\
+ }
+
+BOOST_LOG_TAGGED_INTEGER_OP(<<)
+BOOST_LOG_TAGGED_INTEGER_OP(>>)
+
+#undef BOOST_LOG_TAGGED_INTEGER_OP
+
+} // namespace aux
+
+BOOST_LOG_CLOSE_NAMESPACE // namespace log
+
+} // namespace boost
+
+#include <boost/log/detail/footer.hpp>
+
+#endif // BOOST_LOG_TAGGED_INTEGER_HPP_INCLUDED_