From b9db15b48e5c1ff2e32ca12f2faab53613cd12fa Mon Sep 17 00:00:00 2001 From: Ivo Hinkelmann Date: Mon, 20 Aug 2007 14:50:23 +0000 Subject: INTEGRATION: CWS np1 (1.1.2); FILE ADDED 2007/07/16 09:22:22 np 1.1.2.3: Align format of internal header guard defines 2007/07/11 14:41:39 np 1.1.2.2: #i76769# 2007/04/27 16:36:44 np 1.1.2.1: #i76769# --- o3tl/inc/o3tl/range.hxx | 197 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 o3tl/inc/o3tl/range.hxx (limited to 'o3tl') diff --git a/o3tl/inc/o3tl/range.hxx b/o3tl/inc/o3tl/range.hxx new file mode 100644 index 000000000000..e34eec0cfbab --- /dev/null +++ b/o3tl/inc/o3tl/range.hxx @@ -0,0 +1,197 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: range.hxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: ihi $ $Date: 2007-08-20 15:50:23 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ + +#ifndef INCLUDED_O3TL_RANGE_HXX +#define INCLUDED_O3TL_RANGE_HXX + + +#include // for std::size_t +#include + + + +namespace o3tl +{ +/** Represents a range of integer or iterator values. + + @tpl T + Has to be assignable, add- and subtractable. That is: + either it is + - an integral type + - or a random access iterator. +*/ +template +class range +{ + public: + typedef T element_type; /// Provided for generic programming. + typedef range self; + + // LIFECYCLE + range( + T i_inclusiveLowerBorder, + T i_exclusiveUpperBorder ); + ~range(); + // INQUIRY + T begin() const; + T end() const; + std::size_t size() const; + + bool contains( + T i_value ) const; + bool contains( + const self & i_other ) const; + bool overlaps( + const self & i_other ) const; + /// @return i_other.begin() - this->end() + long distance_to( + const self & i_other ) const; + private: + // DATA + T nBegin; + T nEnd; +}; + + +template +inline range +make_range(T i1, T i2) +{ + return range(i1, i2); +} + +template +inline range +range_of(const T & i_container) +{ + return make_range( i_container.begin(), + i_container.end() + ); +} + +template +inline range +range_of(T & io_container) +{ + return make_range( io_container.begin(), + io_container.end() + ); +} + + + + + +// IMPLEMENTATION + +template +range::range( T i_inclusiveLowerBorder, + T i_exclusiveUpperBorder ) + : nBegin(i_inclusiveLowerBorder), + nEnd(i_exclusiveUpperBorder) +{ + BOOST_ASSERT( nBegin <= nEnd + && "Invalid parameters for range<> constructor."); +} + +template +range::~range() +{ +} + +template +inline T +range::begin() const +{ + return nBegin; +} + +template +inline T +range::end() const +{ + return nEnd; +} + +template +inline std::size_t +range::size() const +{ + BOOST_ASSERT( nBegin <= nEnd + && "Invalid range limits in range<>::size()."); + return static_cast( end() - begin() ); +} + +template +bool +range::contains(T i_value ) const +{ + return begin() <= i_value + && i_value < end(); +} + +template +bool +range::contains(const self & i_other) const +{ + // This is subtle, because this would be wrong: + // begin() <= i_other.begin() + // && i_other.end() <= end(); + // An empty range that begins and starts at my end() + // must not be contained. + + return contains(i_other.begin()) + && i_other.end() <= end(); +} + +template +bool +range::overlaps(const self & i_other) const +{ + return contains(i_other.begin()) + || i_other.contains(begin()); +} + +template +long +range::distance_to(const self & i_other) const +{ + return i_other.begin() - end(); +} + + + +} // namespace o3tl +#endif -- cgit