Added "reversible_view" to allow iterating forward/backward through a range based on a template parameter

[SVN r61366]
This commit is contained in:
Barend Gehrels 2010-04-18 17:41:33 +00:00
parent e4d8c6d72f
commit 5cfdb62a4d
5 changed files with 353 additions and 3 deletions

View File

@ -23,8 +23,8 @@ namespace boost { namespace geometry
\ingroup utility
\details Is used to have one implementation for both const and non const
range iterators
\note This traits class is completely independant from GGL and might be a
separate addition to Boost
\note This traits class is completely independant from Boost.Geometry and
might be a separate addition to Boost
\note Used in for_each
*/
template <bool IsConst, typename Range>

View File

@ -0,0 +1,87 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
//
// Copyright Barend Gehrels 2010, Geodan, Amsterdam, the Netherlands.
// 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)
#ifndef BOOST_GEOMETRY_UTIL_REVERSIBLE_VIEW_HPP
#define BOOST_GEOMETRY_UTIL_REVERSIBLE_VIEW_HPP
#include <boost/type_traits.hpp>
#include <boost/type_traits/remove_const.hpp>
#include <boost/geometry/core/ring_type.hpp>
#include <boost/geometry/core/tag.hpp>
#include <boost/geometry/core/tags.hpp>
namespace boost { namespace geometry {
#ifndef DOXYGEN_NO_DETAIL
namespace detail
{
template <typename Range>
struct reversible_base_view
{
Range& m_range;
reversible_base_view(Range& r)
: m_range(r)
{}
};
}
#endif
enum iterate_direction { iterate_forward, iterate_reverse };
template <typename Range, iterate_direction Direction>
struct reversible_view {};
template <typename Range>
struct reversible_view<Range, iterate_forward> : detail::reversible_base_view<Range>
{
reversible_view(Range& r)
: reversible_base_view(r)
{}
typedef typename boost::range_iterator<const Range>::type const_iterator;
typedef typename boost::range_iterator<Range>::type iterator;
const_iterator begin() const { return boost::begin(m_range); }
const_iterator end() const { return boost::end(m_range); }
iterator begin() { return boost::begin(m_range); }
iterator end() { return boost::end(m_range); }
};
template <typename Range>
struct reversible_view<Range, iterate_reverse> : detail::reversible_base_view<Range>
{
reversible_view(Range& r)
: reversible_base_view(r)
{}
typedef typename boost::range_reverse_iterator<Range const>::type const_iterator;
typedef typename boost::range_reverse_iterator<Range>::type iterator;
const_iterator begin() const { return boost::rbegin(m_range); }
const_iterator end() const { return boost::rend(m_range); }
iterator begin() { return boost::rbegin(m_range); }
iterator end() { return boost::rend(m_range); }
};
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_UTIL_REVERSIBLE_VIEW_HPP

View File

@ -1,5 +1,5 @@
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
# Visual C++ Express 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ever_circling_iterator", "ever_circling_iterator.vcproj", "{73F8C969-FA1E-4D9D-81F9-35B1206F0C14}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "circular_iterator", "circular_iterator.vcproj", "{46571A34-B68D-4854-90C0-56D29EE63FFE}"

View File

@ -0,0 +1,79 @@
// Boost.Geometry (aka GGL, Generic Geometry Library) test file
//
// Copyright Barend Gehrels 2010, Geodan, Amsterdam, the Netherlands
// 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 <algorithm>
#include <iterator>
#include <sstream>
#include <string>
#include <geometry_test_common.hpp>
#include <boost/geometry/util/reversible_view.hpp>
#include <boost/geometry/extensions/gis/io/wkt/read_wkt.hpp>
#include <boost/geometry/util/write_dsv.hpp>
#include <boost/geometry/geometries/cartesian2d.hpp>
#include <boost/geometry/geometries/adapted/tuple_cartesian.hpp>
template <boost::geometry::iterate_direction Direction, typename Range>
void test_forward_or_reverse(Range const& range, std::string const& expected)
{
typedef boost::geometry::reversible_view
<
Range const,
Direction
> view_type;
view_type view(range);
bool first = true;
std::ostringstream out;
for (typename boost::range_iterator<view_type const>::type
it = boost::begin(view);
it != boost::end(view);
++it, first = false)
{
out << (first ? "" : " ") << boost::geometry::dsv(*it);
}
BOOST_CHECK_EQUAL(out.str(), expected);
}
template <typename Geometry>
void test_geometry(std::string const& wkt,
std::string const& expected_forward, std::string const& expected_reverse)
{
namespace bg = boost::geometry;
Geometry geo;
bg::read_wkt(wkt, geo);
test_forward_or_reverse<bg::iterate_forward>(geo, expected_forward);
test_forward_or_reverse<bg::iterate_reverse>(geo, expected_reverse);
}
template <typename P>
void test_all()
{
test_geometry<boost::geometry::linestring<P> >(
"linestring(1 1,2 2,3 3)",
"(1, 1) (2, 2) (3, 3)",
"(3, 3) (2, 2) (1, 1)");
}
int test_main(int, char* [])
{
namespace bg = boost::geometry;
test_all<bg::point_2d>();
test_all<bg::point<int, 2, bg::cs::cartesian> >();
test_all<boost::tuple<double, double> >();
return 0;
}

View File

@ -0,0 +1,184 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="reversible_view"
ProjectGUID="{BFB08FEE-76D6-4F3D-9184-BE03CC3F7968}"
RootNamespace="reversible_view"
Keyword="Win32Proj"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)\reversible_view"
ConfigurationType="1"
InheritedPropertySheets="..\boost.vsprops"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="../../../..;.."
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
ExceptionHandling="2"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="kernel32.lib $(NoInherit)"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)\reversible_view"
ConfigurationType="1"
InheritedPropertySheets="..\boost.vsprops"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="../../../..;.."
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
ExceptionHandling="2"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="kernel32.lib $(NoInherit)"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<File
RelativePath=".\reversible_view.cpp"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>