• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //  (C) Copyright Gennadiy Rozental 2001.
2 //  Distributed under the Boost Software License, Version 1.0.
3 //  (See accompanying file LICENSE_1_0.txt or copy at
4 //  http://www.boost.org/LICENSE_1_0.txt)
5 
6 //  See http://www.boost.org/libs/test for the library home page.
7 //
8 //!@file
9 //!@brief simple dataset size abstraction (can be infinite)
10 // ***************************************************************************
11 
12 #ifndef BOOST_TEST_DATA_SIZE_HPP_102211GER
13 #define BOOST_TEST_DATA_SIZE_HPP_102211GER
14 
15 // Boost.Test
16 #include <boost/test/data/config.hpp>
17 
18 // STL
19 #include <iosfwd>
20 
21 #include <boost/test/detail/suppress_warnings.hpp>
22 
23 //____________________________________________________________________________//
24 
25 namespace boost {
26 namespace unit_test {
27 namespace data {
28 
29 // ************************************************************************** //
30 // **************                    size_t                    ************** //
31 // ************************************************************************** //
32 
33 //! Utility for handling the size of a datasets
34 class size_t {
nonnullboost::unit_test::data::size_t::dummy35     struct dummy { void nonnull() {} };
36     typedef void (dummy::*safe_bool)();
37 public:
38     // Constructors
size_t(std::size_t s=0)39     size_t( std::size_t s = 0 )         : m_value( s ), m_infinity( false ) {}
size_t(bool)40     explicit        size_t( bool )      : m_value( 0 ), m_infinity( true ) {}
41     template<typename T>
size_t(T v)42     size_t( T v )                       : m_value( static_cast<std::size_t>(v) ), m_infinity( false ) {}
43 
44     // Access methods
value() const45     std::size_t     value() const       { return m_value; }
is_inf() const46     bool            is_inf() const      { return m_infinity; }
operator safe_bool() const47     operator        safe_bool() const   { return is_inf() || m_value != 0 ? &dummy::nonnull : 0; }
48 
49     // Unary operators
operator --()50     data::size_t    operator--()        { if( !is_inf() ) m_value--; return *this; }
operator --(int)51     data::size_t    operator--(int)     { data::size_t res(*this); if( !is_inf() ) m_value--; return res; }
operator ++()52     data::size_t    operator++()        { if( !is_inf() ) m_value++; return *this; }
operator ++(int)53     data::size_t    operator++(int)     { data::size_t res(*this); if( !is_inf() ) m_value++; return res; }
54 
55     // Binary operators
operator +=(std::size_t rhs)56     data::size_t&   operator+=( std::size_t rhs ) { if( !is_inf() ) m_value += rhs; return *this; }
operator +=(data::size_t rhs)57     data::size_t&   operator+=( data::size_t rhs )
58     {
59         if( !is_inf() ) {
60             if( rhs.is_inf() )
61                 *this = rhs;
62             else
63                 m_value += rhs.value();
64         }
65         return *this;
66     }
operator -=(std::size_t rhs)67     data::size_t&   operator-=( std::size_t rhs ) { if( !is_inf() ) m_value -= rhs; return *this; }
operator -=(data::size_t rhs)68     data::size_t&   operator-=( data::size_t rhs )
69     {
70         if( !is_inf() ) {
71             if( value() < rhs.value() )
72                 m_value = 0;
73             else
74                 m_value -= rhs.value();
75         }
76         return *this;
77     }
78 
79 private:
80     // Data members
81     std::size_t     m_value;
82     bool            m_infinity;
83 };
84 
85 namespace { const data::size_t BOOST_TEST_DS_INFINITE_SIZE( true ); }
86 
87 //____________________________________________________________________________//
88 
89 // Binary operators
operator >(data::size_t lhs,std::size_t rhs)90 inline bool operator>(data::size_t lhs, std::size_t rhs)    { return lhs.is_inf()  || (lhs.value() > rhs); }
operator >(std::size_t lhs,data::size_t rhs)91 inline bool operator>(std::size_t lhs, data::size_t rhs)    { return !rhs.is_inf() && (lhs > rhs.value()); }
operator >(data::size_t lhs,data::size_t rhs)92 inline bool operator>(data::size_t lhs, data::size_t rhs)   { return lhs.is_inf() ^ rhs.is_inf() ? lhs.is_inf() : lhs.value() > rhs.value(); }
93 
operator >=(data::size_t lhs,std::size_t rhs)94 inline bool operator>=(data::size_t lhs, std::size_t rhs )  { return lhs.is_inf()  || (lhs.value() >= rhs); }
operator >=(std::size_t lhs,data::size_t rhs)95 inline bool operator>=(std::size_t lhs, data::size_t rhs)   { return !rhs.is_inf() && (lhs >= rhs.value()); }
operator >=(data::size_t lhs,data::size_t rhs)96 inline bool operator>=(data::size_t lhs, data::size_t rhs)  { return lhs.is_inf() ^ rhs.is_inf() ? lhs.is_inf() : lhs.value() >= rhs.value(); }
97 
operator <(data::size_t lhs,std::size_t rhs)98 inline bool operator<(data::size_t lhs, std::size_t rhs)    { return !lhs.is_inf() && (lhs.value() < rhs); }
operator <(std::size_t lhs,data::size_t rhs)99 inline bool operator<(std::size_t lhs, data::size_t rhs)    { return rhs.is_inf()  || (lhs < rhs.value()); }
operator <(data::size_t lhs,data::size_t rhs)100 inline bool operator<(data::size_t lhs, data::size_t rhs)   { return lhs.is_inf() ^ rhs.is_inf() ? rhs.is_inf() : lhs.value() < rhs.value(); }
101 
operator <=(data::size_t lhs,std::size_t rhs)102 inline bool operator<=(data::size_t lhs, std::size_t rhs)   { return !lhs.is_inf() && (lhs.value() <= rhs); }
operator <=(std::size_t lhs,data::size_t rhs)103 inline bool operator<=(std::size_t lhs, data::size_t rhs)   { return rhs.is_inf()  || (lhs <= rhs.value()); }
operator <=(data::size_t lhs,data::size_t rhs)104 inline bool operator<=(data::size_t lhs, data::size_t rhs)  { return lhs.is_inf() ^ rhs.is_inf() ? rhs.is_inf() : lhs.value() <= rhs.value(); }
105 
operator ==(data::size_t lhs,std::size_t rhs)106 inline bool operator==(data::size_t lhs, std::size_t rhs)   { return !lhs.is_inf() && (lhs.value() == rhs); }
operator ==(std::size_t lhs,data::size_t rhs)107 inline bool operator==(std::size_t lhs, data::size_t rhs)   { return !rhs.is_inf() && (lhs == rhs.value()); }
operator ==(data::size_t lhs,data::size_t rhs)108 inline bool operator==(data::size_t lhs, data::size_t rhs)  { return !(lhs.is_inf() ^ rhs.is_inf()) && lhs.value() == rhs.value(); }
109 
operator !=(data::size_t lhs,std::size_t rhs)110 inline bool operator!=(data::size_t lhs, std::size_t rhs)   { return lhs.is_inf() || (lhs.value() != rhs); }
operator !=(std::size_t lhs,data::size_t rhs)111 inline bool operator!=(std::size_t lhs, data::size_t rhs)   { return rhs.is_inf() || (lhs != rhs.value()); }
operator !=(data::size_t lhs,data::size_t rhs)112 inline bool operator!=(data::size_t lhs, data::size_t rhs)  { return lhs.is_inf() ^ rhs.is_inf() || lhs.value() != rhs.value(); }
113 
operator +(data::size_t lhs,std::size_t rhs)114 inline data::size_t operator+(data::size_t lhs, std::size_t rhs)  { return lhs.is_inf() ? lhs : data::size_t( lhs.value()+rhs ); }
operator +(std::size_t lhs,data::size_t rhs)115 inline data::size_t operator+(std::size_t lhs, data::size_t rhs)  { return rhs.is_inf() ? rhs : data::size_t( lhs+rhs.value() ); }
operator +(data::size_t lhs,data::size_t rhs)116 inline data::size_t operator+(data::size_t lhs, data::size_t rhs) { return lhs.is_inf() || rhs.is_inf() ? data::size_t(true) : data::size_t( lhs.value()+rhs.value() ); }
117 
operator *(data::size_t lhs,std::size_t rhs)118 inline data::size_t operator*(data::size_t lhs, std::size_t rhs)  { return lhs.is_inf() ? lhs : data::size_t( lhs.value()*rhs ); }
operator *(std::size_t lhs,data::size_t rhs)119 inline data::size_t operator*(std::size_t lhs, data::size_t rhs)  { return rhs.is_inf() ? rhs : data::size_t( lhs*rhs.value() ); }
operator *(data::size_t lhs,data::size_t rhs)120 inline data::size_t operator*(data::size_t lhs, data::size_t rhs) { return lhs.is_inf() || rhs.is_inf() ? data::size_t(true) : data::size_t( lhs.value()*rhs.value() ); }
121 
122 //____________________________________________________________________________//
123 
124 template<typename CharT1, typename Tr>
125 inline std::basic_ostream<CharT1,Tr>&
operator <<(std::basic_ostream<CharT1,Tr> & os,data::size_t const & s)126 operator<<( std::basic_ostream<CharT1,Tr>& os, data::size_t const& s )
127 {
128     if( s.is_inf() )
129         os << "infinity";
130     else
131         os << s.value();
132 
133     return os;
134 }
135 
136 //____________________________________________________________________________//
137 
138 } // namespace data
139 } // namespace unit_test
140 } // namespace boost
141 
142 #include <boost/test/detail/enable_warnings.hpp>
143 
144 #endif // BOOST_TEST_DATA_SIZE_HPP_102211GER
145 
146