| #ifndef BOOST_SERIALIZATION_COLLECTION_SIZE_TYPE_HPP |
| #define BOOST_SERIALIZATION_COLLECTION_SIZE_TYPE_HPP |
| |
| // (C) Copyright 2005 Matthias Troyer |
| // (C) Copyright 2020 Robert Ramey |
| |
| // Use, modification and distribution is subject to 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) |
| |
| #include <cstddef> // size_t |
| #include <boost/assert.hpp> |
| #include <boost/operators.hpp> |
| #include <boost/serialization/level.hpp> |
| #include <boost/serialization/is_bitwise_serializable.hpp> |
| |
| namespace boost { |
| namespace serialization { |
| |
| template<typename T> // T is the basic type holding the integer |
| struct cardinal_number : private |
| boost::totally_ordered<cardinal_number<T> >, |
| boost::additive<cardinal_number<T> >, |
| boost::unit_steppable<cardinal_number<T> > |
| { |
| private: |
| template<typename CharType, typename Traits> |
| friend std::basic_ostream<CharType, Traits> & operator<<( |
| const std::basic_ostream<CharType, Traits> & bos, |
| const cardinal_number & rhs |
| ); |
| template<typename CharType, typename Traits> |
| friend std::basic_istream<CharType, Traits> & operator>>( |
| std::basic_istream<CharType, Traits> & bis, |
| const cardinal_number & rhs |
| ); |
| public: |
| T m_t; |
| cardinal_number(T t = 0) : |
| m_t(t) |
| {} |
| cardinal_number(unsigned int t) : |
| m_t(t) |
| {} |
| cardinal_number(int t) : |
| m_t(t) |
| { |
| BOOST_ASSERT(t >= 0); |
| } |
| operator const T (){ |
| return m_t; |
| } |
| // assignment operator |
| cardinal_number & operator=(const cardinal_number & rhs){ |
| m_t = rhs.m_t; |
| return *this; |
| } |
| // basic operations upon which others depend |
| // totally ordered / less_than_comparable |
| bool operator<(const cardinal_number & rhs) const { |
| return m_t < rhs.m_t; |
| } |
| bool operator==(const cardinal_number & rhs) const { |
| return m_t == rhs.m_t; |
| } |
| // additive |
| cardinal_number & operator+=(const cardinal_number & rhs){ |
| m_t += rhs.m_t; |
| return *this; |
| } |
| // subtractive |
| cardinal_number & operator-=(const cardinal_number & rhs){ |
| BOOST_ASSERT(m_t >= rhs.m_t); |
| m_t -= rhs.m_t; |
| return *this; |
| } |
| // increment |
| cardinal_number operator++(){ |
| ++m_t; |
| return *this; |
| } |
| // decrement |
| cardinal_number operator--(){ |
| BOOST_ASSERT(m_t > T(0)); |
| --m_t; |
| return *this; |
| } |
| }; |
| |
| typedef cardinal_number<std::size_t> collection_size_type; |
| |
| } } // end namespace boost::serialization |
| |
| #include <ostream> |
| #include <istream> |
| |
| namespace std { |
| |
| template<typename CharType, typename Traits> |
| basic_ostream<CharType, Traits> & operator<<( |
| std::basic_ostream<CharType, Traits> & bos, |
| const boost::serialization::collection_size_type & rhs |
| ){ |
| bos << rhs.m_t; |
| return bos; |
| } |
| |
| template<typename CharType, typename Traits> |
| basic_istream<CharType, Traits> & operator>>( |
| std::basic_istream<CharType, Traits> & bis, |
| boost::serialization::collection_size_type & rhs |
| ){ |
| bis >> rhs.m_t; |
| return bis; |
| } |
| |
| } // std |
| |
| BOOST_CLASS_IMPLEMENTATION( \ |
| boost::serialization::collection_size_type, \ |
| primitive_type \ |
| ) |
| BOOST_IS_BITWISE_SERIALIZABLE(boost::serialization::collection_size_type) |
| |
| #endif //BOOST_SERIALIZATION_COLLECTION_SIZE_TYPE_HPP |