]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/log/include/boost/log/detail/tagged_integer.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / log / include / boost / log / detail / tagged_integer.hpp
CommitLineData
7c673cae
FG
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 tagged_integer.hpp
9 * \author Andrey Semashev
10 * \date 11.01.2008
11 *
12 * \brief This header is the Boost.Log library implementation, see the library documentation
13 * at http://www.boost.org/doc/libs/release/libs/log/doc/html/index.html.
14 */
15
16#ifndef BOOST_LOG_TAGGED_INTEGER_HPP_INCLUDED_
17#define BOOST_LOG_TAGGED_INTEGER_HPP_INCLUDED_
18
19#include <boost/log/detail/config.hpp>
20#include <boost/log/detail/header.hpp>
21
22#ifdef BOOST_HAS_PRAGMA_ONCE
23#pragma once
24#endif
25
26namespace boost {
27
28BOOST_LOG_OPEN_NAMESPACE
29
30namespace aux {
31
32//! A tagged integer wrapper for type safety
33template< typename IntT, typename TagT >
34struct tagged_integer
35{
36 //! Contained value type
37 typedef IntT integer_type;
38 //! Tag
39 typedef TagT tag;
40
41 //! Contained value
42 integer_type value;
43
44 //! Conversion operator
45 BOOST_CONSTEXPR operator integer_type() const BOOST_NOEXCEPT { return value; }
46
47 // Increment
48 tagged_integer& operator++ () BOOST_NOEXCEPT { ++value; return *this; }
49 tagged_integer operator++ (int) BOOST_NOEXCEPT { tagged_integer temp = *this; ++value; return temp; }
50 // Decrement
51 tagged_integer& operator-- () BOOST_NOEXCEPT { --value; return *this; }
52 tagged_integer operator-- (int) BOOST_NOEXCEPT { tagged_integer temp = *this; --value; return temp; }
53
54#define BOOST_LOG_TAGGED_INTEGER_OP(op)\
55 tagged_integer& operator op (tagged_integer const& that) BOOST_NOEXCEPT { value op that.value; return *this; }
56
57 BOOST_LOG_TAGGED_INTEGER_OP(|=)
58 BOOST_LOG_TAGGED_INTEGER_OP(&=)
59 BOOST_LOG_TAGGED_INTEGER_OP(^=)
60 BOOST_LOG_TAGGED_INTEGER_OP(+=)
61 BOOST_LOG_TAGGED_INTEGER_OP(-=)
62 BOOST_LOG_TAGGED_INTEGER_OP(*=)
63 BOOST_LOG_TAGGED_INTEGER_OP(/=)
64 BOOST_LOG_TAGGED_INTEGER_OP(%=)
65
66#undef BOOST_LOG_TAGGED_INTEGER_OP
67
68 //! Inversion operator
69 tagged_integer& operator~ () BOOST_NOEXCEPT { ~value; return *this; }
70
71 // Shift operators
72 template< typename T >
73 tagged_integer& operator<<= (T const& that) BOOST_NOEXCEPT { value <<= that; return *this; }
74 template< typename T >
75 tagged_integer& operator>>= (T const& that) BOOST_NOEXCEPT { value >>= that; return *this; }
76
77private:
78 // Protection against improper usage
79 template< typename T1, typename T2 >
80 tagged_integer& operator<<= (tagged_integer< T1, T2 > const&);
81 template< typename T1, typename T2 >
82 tagged_integer& operator>>= (tagged_integer< T1, T2 > const&);
83};
84
85 // Relational operators
86#define BOOST_LOG_TAGGED_INTEGER_OP(op)\
87 template< typename IntT, typename TagT >\
88 inline bool operator op (\
89 tagged_integer< IntT, TagT > const& left, tagged_integer< IntT, TagT > const& right) BOOST_NOEXCEPT\
90 {\
91 return (left.value op right.value);\
92 }
93
94BOOST_LOG_TAGGED_INTEGER_OP(==)
95BOOST_LOG_TAGGED_INTEGER_OP(!=)
96BOOST_LOG_TAGGED_INTEGER_OP(<)
97BOOST_LOG_TAGGED_INTEGER_OP(>)
98BOOST_LOG_TAGGED_INTEGER_OP(<=)
99BOOST_LOG_TAGGED_INTEGER_OP(>=)
100
101#undef BOOST_LOG_TAGGED_INTEGER_OP
102
103#define BOOST_LOG_TAGGED_INTEGER_OP(op)\
104 template< typename IntT, typename TagT >\
105 inline tagged_integer< IntT, TagT > operator op (\
106 tagged_integer< IntT, TagT > const& left, tagged_integer< IntT, TagT > const& right) BOOST_NOEXCEPT\
107 {\
108 tagged_integer< IntT, TagT > temp = left;\
109 temp op##= right;\
110 return temp;\
111 }
112
113BOOST_LOG_TAGGED_INTEGER_OP(|)
114BOOST_LOG_TAGGED_INTEGER_OP(&)
115BOOST_LOG_TAGGED_INTEGER_OP(^)
116BOOST_LOG_TAGGED_INTEGER_OP(+)
117BOOST_LOG_TAGGED_INTEGER_OP(-)
118BOOST_LOG_TAGGED_INTEGER_OP(*)
119BOOST_LOG_TAGGED_INTEGER_OP(/)
120BOOST_LOG_TAGGED_INTEGER_OP(%)
121
122#undef BOOST_LOG_TAGGED_INTEGER_OP
123
124#define BOOST_LOG_TAGGED_INTEGER_OP(op)\
125 template< typename IntT, typename TagT, typename T >\
126 inline tagged_integer< IntT, TagT > operator op (\
127 tagged_integer< IntT, TagT > const& left, T const& right) BOOST_NOEXCEPT\
128 {\
129 tagged_integer< IntT, TagT > temp = left;\
130 temp op##= right;\
131 return temp;\
132 }
133
134BOOST_LOG_TAGGED_INTEGER_OP(<<)
135BOOST_LOG_TAGGED_INTEGER_OP(>>)
136
137#undef BOOST_LOG_TAGGED_INTEGER_OP
138
139} // namespace aux
140
141BOOST_LOG_CLOSE_NAMESPACE // namespace log
142
143} // namespace boost
144
145#include <boost/log/detail/footer.hpp>
146
147#endif // BOOST_LOG_TAGGED_INTEGER_HPP_INCLUDED_