PageRenderTime 23ms CodeModel.GetById 13ms app.highlight 7ms RepoModel.GetById 1ms app.codeStats 1ms

/libs/geometry/test/test_geometries/wrapped_boost_array.hpp

https://github.com/delalond/boost_1_54_0-bgq
C++ Header | 151 lines | 107 code | 34 blank | 10 comment | 0 complexity | 15c44549cdb96e1594d4d30219277eaf MD5 | raw file
  1// Boost.Geometry (aka GGL, Generic Geometry Library) 
  2// Unit Test
  3
  4// Copyright (c) 2010-2012 Barend Gehrels, Amsterdam, the Netherlands.
  5
  6// Use, modification and distribution is subject to the Boost Software License,
  7// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  8// http://www.boost.org/LICENSE_1_0.txt)
  9
 10
 11#ifndef GEOMETRY_TEST_TEST_GEOMETRIES_WRAPPED_BOOST_ARRAY_HPP
 12#define GEOMETRY_TEST_TEST_GEOMETRIES_WRAPPED_BOOST_ARRAY_HPP
 13
 14#include <cstddef>
 15
 16#include <boost/array.hpp>
 17#include <boost/range.hpp>
 18
 19#include <boost/geometry/core/mutable_range.hpp>
 20#include <boost/geometry/core/tag.hpp>
 21#include <boost/geometry/core/tags.hpp>
 22
 23
 24namespace test
 25{
 26
 27template <typename Point, std::size_t Count>
 28struct wrapped_boost_array
 29{
 30    inline wrapped_boost_array() : size(0) {}
 31
 32    boost::array<Point, Count> array;
 33    int size;
 34};
 35
 36
 37} // namespace test
 38
 39
 40// 1a: adapt to Boost.Range
 41namespace boost
 42{
 43    using namespace test;
 44
 45    template <typename Point, std::size_t Count>
 46    struct range_mutable_iterator<wrapped_boost_array<Point, Count> >
 47        : public range_mutable_iterator<boost::array<Point, Count> >
 48    {};
 49
 50    template <typename Point, std::size_t Count>
 51    struct range_const_iterator<wrapped_boost_array<Point, Count> >
 52        : public range_const_iterator<boost::array<Point, Count> >
 53    {};
 54
 55
 56} // namespace 'boost'
 57
 58
 59// 1b) adapt to Boost.Range with ADP
 60namespace test
 61{
 62    template <typename Point, std::size_t Count>
 63    inline typename boost::range_iterator
 64        <
 65            wrapped_boost_array<Point, Count>
 66        >::type range_begin(wrapped_boost_array<Point, Count>& ar)
 67    {
 68        return ar.array.begin();
 69    }
 70
 71    template <typename Point, std::size_t Count>
 72    inline typename boost::range_iterator
 73        <
 74            wrapped_boost_array<Point, Count> const
 75        >::type range_begin(wrapped_boost_array<Point, Count> const& ar)
 76    {
 77        return ar.array.begin();
 78    }
 79
 80    template <typename Point, std::size_t Count>
 81    inline typename boost::range_iterator
 82        <
 83            wrapped_boost_array<Point, Count>
 84        >::type range_end(wrapped_boost_array<Point, Count>& ar)
 85    {
 86        typename boost::range_iterator
 87            <
 88                wrapped_boost_array<Point, Count>
 89            >::type it = ar.array.begin();
 90        return it + ar.size;
 91    }
 92
 93    template <typename Point, std::size_t Count>
 94    inline typename boost::range_iterator
 95        <
 96            wrapped_boost_array<Point, Count> const
 97        >::type range_end(wrapped_boost_array<Point, Count> const& ar)
 98    {
 99        typename boost::range_iterator
100            <
101                wrapped_boost_array<Point, Count> const
102            >::type it = ar.array.begin();
103        return it + ar.size;
104    }
105
106}
107
108
109// 2: adapt to Boost.Geometry
110namespace boost { namespace geometry { namespace traits
111{
112
113    template <typename Point, std::size_t Count>
114    struct tag< wrapped_boost_array<Point, Count> >
115    {
116        typedef linestring_tag type;
117    };
118
119    template <typename Point, std::size_t Count>
120    struct clear< wrapped_boost_array<Point, Count> >
121    {
122        static inline void apply(wrapped_boost_array<Point, Count>& ar)
123        {
124            ar.size = 0;
125        }
126    };
127
128    template <typename Point, std::size_t Count>
129    struct push_back< wrapped_boost_array<Point, Count> >
130    {
131        static inline void apply(wrapped_boost_array<Point, Count>& ar, Point const& point)
132        {
133            // BOOST_ASSERT((ar.size < Count));
134            ar.array[ar.size++] = point;
135        }
136    };
137
138    template <typename Point, std::size_t Count>
139    struct resize< wrapped_boost_array<Point, Count> >
140    {
141        static inline void apply(wrapped_boost_array<Point, Count>& ar, std::size_t new_size)
142        {
143            BOOST_ASSERT(new_size < Count);
144            ar.size = new_size;
145        }
146    };
147
148}}} // namespace bg::traits
149
150
151#endif // GEOMETRY_TEST_TEST_GEOMETRIES_WRAPPED_BOOST_ARRAY_HPP