blob: df32c3104db9d0c7f31b70f5ca6de5a18de85a90 [file] [log] [blame]
#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