blob: dbd6a99e155115db6e748543128e3c21e72a21e3 [file] [log] [blame]
//////////////////////////////////////////////////////////////////////////////
//
// (C) Copyright Ion Gaztanaga 2007. 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)
//
// See http://www.boost.org/libs/interprocess for documentation.
//
//////////////////////////////////////////////////////////////////////////////
#include <boost/interprocess/detail/config_begin.hpp>
#include <boost/interprocess/offset_ptr.hpp>
#include <boost/interprocess/detail/type_traits.hpp>
using namespace boost::interprocess;
bool test_types_and_convertions()
{
typedef offset_ptr<int> pint_t;
typedef offset_ptr<const int> pcint_t;
typedef offset_ptr<volatile int> pvint_t;
typedef offset_ptr<const volatile int> pcvint_t;
if(!detail::is_same<pint_t::value_type, int>::value)
return false;
if(!detail::is_same<pcint_t::value_type, const int>::value)
return false;
if(!detail::is_same<pvint_t::value_type, volatile int>::value)
return false;
if(!detail::is_same<pcvint_t::value_type, const volatile int>::value)
return false;
int dummy_int = 9;
{ pint_t pint(&dummy_int); pcint_t pcint(pint);
if(pcint.get() != &dummy_int) return false; }
{ pint_t pint(&dummy_int); pvint_t pvint(pint);
if(pvint.get() != &dummy_int) return false; }
{ pint_t pint(&dummy_int); pcvint_t pcvint(pint);
if(pcvint.get() != &dummy_int) return false; }
{ pcint_t pcint(&dummy_int); pcvint_t pcvint(pcint);
if(pcvint.get() != &dummy_int) return false; }
{ pvint_t pvint(&dummy_int); pcvint_t pcvint(pvint);
if(pcvint.get() != &dummy_int) return false; }
pint_t pint(0);
pcint_t pcint(0);
pvint_t pvint(0);
pcvint_t pcvint(0);
pint = &dummy_int;
pcint = &dummy_int;
pvint = &dummy_int;
pcvint = &dummy_int;
{ pcint = pint; if(pcint.get() != &dummy_int) return false; }
{ pvint = pint; if(pvint.get() != &dummy_int) return false; }
{ pcvint = pint; if(pcvint.get() != &dummy_int) return false; }
{ pcvint = pcint; if(pcvint.get() != &dummy_int) return false; }
{ pcvint = pvint; if(pcvint.get() != &dummy_int) return false; }
if(!pint)
return false;
pint = 0;
if(pint)
return false;
return true;
}
bool test_arithmetic()
{
typedef offset_ptr<int> pint_t;
const int NumValues = 5;
int values[NumValues];
//Initialize p
pint_t p = values;
if(p.get() != values)
return false;
//Initialize p + NumValues
pint_t pe = &values[NumValues];
if(pe == p)
return false;
if(pe.get() != &values[NumValues])
return false;
//ptr - ptr
if((pe - p) != NumValues)
return false;
//ptr - integer
if((pe - NumValues) != p)
return false;
//ptr + integer
if((p + NumValues) != pe)
return false;
//integer + ptr
if((NumValues + p) != pe)
return false;
//indexing
if(pint_t(&p[NumValues]) != pe)
return false;
if(pint_t(&pe[-NumValues]) != p)
return false;
//ptr -= integer
pint_t p0 = pe;
p0-= NumValues;
if(p != p0)
return false;
//ptr += integer
pint_t penew = p0;
penew += NumValues;
if(penew != pe)
return false;
//++ptr
penew = p0;
for(int j = 0; j != NumValues; ++j, ++penew);
if(penew != pe)
return false;
//--ptr
p0 = pe;
for(int j = 0; j != NumValues; ++j, --p0);
if(p != p0)
return false;
//ptr++
penew = p0;
for(int j = 0; j != NumValues; ++j){
pint_t p = penew;
if(p != penew++)
return false;
}
//ptr--
p0 = pe;
for(int j = 0; j != NumValues; ++j){
pint_t p = p0;
if(p != p0--)
return false;
}
return true;
}
bool test_comparison()
{
typedef offset_ptr<int> pint_t;
const int NumValues = 5;
int values[NumValues];
//Initialize p
pint_t p = values;
if(p.get() != values)
return false;
//Initialize p + NumValues
pint_t pe = &values[NumValues];
if(pe == p)
return false;
if(pe.get() != &values[NumValues])
return false;
//operators
if(p == pe)
return false;
if(p != p)
return false;
if(!(p < pe))
return false;
if(!(p <= pe))
return false;
if(!(pe > p))
return false;
if(!(pe >= p))
return false;
return true;
}
int main()
{
if(!test_types_and_convertions())
return 1;
if(!test_arithmetic())
return 1;
if(!test_comparison())
return 1;
return 0;
}
#include <boost/interprocess/detail/config_end.hpp>