/* ///////////////////////////////////////////////////////////////////////// * File: rangelib/salgorithms.hpp * * Purpose: Range-adapted Sequence algorithms. * * Created: 19th July 2005 * Updated: 10th August 2009 * * Home: http://stlsoft.org/ * * Copyright (c) 2005-2009, Matthew Wilson and Synesis Software * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither the name(s) of Matthew Wilson and Synesis Software nor the names of * any contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * ////////////////////////////////////////////////////////////////////// */ /** \file rangelib/salgorithms.hpp Range-adapted Sequence algorithms. * * This file includes the definition of the following algorithms: * * - sr_accumulate() * - sr_accumulate() * - sr_copy() * - sr_copy_if() * - sr_count() * - sr_count_if() * - sr_distance() * - sr_equal() * - sr_exists() * - sr_exists_if() * - sr_fill() * - sr_fill_n() * - sr_for_each() * - sr_generate() * - sr_max_element() * - sr_min_element() * - sr_replace() * - sr_replace_if() */ #ifndef RANGELIB_INCL_RANGELIB_HPP_SALGORITHMS #define RANGELIB_INCL_RANGELIB_HPP_SALGORITHMS #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION # define RANGELIB_VER_RANGELIB_HPP_SALGORITHMS_MAJOR 1 # define RANGELIB_VER_RANGELIB_HPP_SALGORITHMS_MINOR 1 # define RANGELIB_VER_RANGELIB_HPP_SALGORITHMS_REVISION 3 # define RANGELIB_VER_RANGELIB_HPP_SALGORITHMS_EDIT 17 #endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */ /* ///////////////////////////////////////////////////////////////////////// * Auto-generation and compatibility */ /* [Incompatibilies-start] STLSOFT_COMPILER_IS_DMC: STLSOFT_COMPILER_IS_MSVC: _MSC_VER < 1200 STLSOFT_COMPILER_IS_MWERKS: (__MWERKS__ & 0xFF00) < 0x3000 [Incompatibilies-end] */ /* ///////////////////////////////////////////////////////////////////////// * Includes */ #ifndef RANGELIB_INCL_RANGELIB_HPP_RANGELIB # include #endif /* !RANGELIB_INCL_RANGELIB_HPP_RANGELIB */ #ifndef RANGELIB_INCL_RANGELIB_HPP_ALGORITHMS # include #endif /* !RANGELIB_INCL_RANGELIB_HPP_ALGORITHMS */ #ifndef RANGELIB_INCL_RANGELIB_HPP_SEQUENCE_RANGE # include #endif /* !RANGELIB_INCL_RANGELIB_HPP_SEQUENCE_RANGE */ #if defined(STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT) # ifndef STLSOFT_INCL_STLSOFT_META_DETECTOR_HPP_HAS_CONST_ITERATOR # include # endif /* !STLSOFT_INCL_STLSOFT_META_DETECTOR_HPP_HAS_CONST_ITERATOR */ # ifndef STLSOFT_INCL_STLSOFT_META_DETECTOR_HPP_HAS_ITERATOR # include # endif /* !STLSOFT_INCL_STLSOFT_META_DETECTOR_HPP_HAS_ITERATOR */ #endif /* STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT */ /* ///////////////////////////////////////////////////////////////////////// * Namespace */ #ifndef RANGELIB_NO_NAMESPACE # if defined(_STLSOFT_NO_NAMESPACE) || \ defined(STLSOFT_DOCUMENTATION_SKIP_SECTION) /* There is no stlsoft namespace, so must define ::rangelib */ namespace rangelib { # else /* Define stlsoft::rangelib_project */ namespace stlsoft { namespace rangelib_project { # endif /* _STLSOFT_NO_NAMESPACE */ #endif /* !RANGELIB_NO_NAMESPACE */ /* ///////////////////////////////////////////////////////////////////////// * Functions */ template< ss_typename_param_k S , ss_typename_param_k T > inline T sr_accumulate(S &s, T val) { #if defined(STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT) STLSOFT_STATIC_ASSERT(stlsoft::has_iterator::value || stlsoft::has_const_iterator::value); #endif /* STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT */ return r_accumulate(sequence_range(s), val); } template< ss_typename_param_k S , ss_typename_param_k T , ss_typename_param_k P > inline T sr_accumulate(S &s, T val, P pred) { #if defined(STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT) STLSOFT_STATIC_ASSERT(stlsoft::has_iterator::value || stlsoft::has_const_iterator::value); #endif /* STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT */ return r_accumulate(sequence_range(s), val, pred); } template< ss_typename_param_k S , ss_typename_param_k O > inline O sr_copy(S &s, O o) { return r_copy(sequence_range(s), o); } template< ss_typename_param_k S , ss_typename_param_k O , ss_typename_param_k P > inline O sr_copy_if(S &s, O o, P pred) { return r_copy_if(sequence_range(s), o, pred); } template< ss_typename_param_k S , ss_typename_param_k V > inline size_t sr_count(S &s, V const& val) { #if defined(STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT) STLSOFT_STATIC_ASSERT(stlsoft::has_iterator::value || stlsoft::has_const_iterator::value); #endif /* STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT */ return r_count(sequence_range(s), val); } template< ss_typename_param_k S , ss_typename_param_k P > inline size_t sr_count_if(S &s, P pred) { #if defined(STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT) STLSOFT_STATIC_ASSERT(stlsoft::has_iterator::value || stlsoft::has_const_iterator::value); #endif /* STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT */ return r_count_if(sequence_range(s), pred); } template inline ss_ptrdiff_t sr_distance(S &s) { return r_distance(sequence_range(s)); } template< ss_typename_param_k S1 , ss_typename_param_k S2 > inline ss_bool_t sr_equal(S1 &s1, S2 &s2) { STLSOFT_ASSERT(sr_distance(s1) <= sr_distance(s2)); return r_equal(sequence_range(s1), sequence_range(s2)); } template< ss_typename_param_k S , ss_typename_param_k T > inline ss_bool_t sr_exists(S &s, T const& val) { return r_exists(sequence_range(s), val); } template< ss_typename_param_k S , ss_typename_param_k P > inline ss_bool_t sr_exists_if(S &s, P pred) { return r_exists_if(sequence_range(s), pred); } template< ss_typename_param_k S , ss_typename_param_k T > inline void sr_fill(S &s, T const& val) { r_fill(sequence_range(s), val); } template< ss_typename_param_k S , ss_typename_param_k N , ss_typename_param_k T > inline void sr_fill_n(S &s, N n, T const& val) { STLSOFT_ASSERT(n <= r_distance(s)); r_fill_n(sequence_range(s), n, val); } template< ss_typename_param_k S , ss_typename_param_k F > inline F sr_for_each(S &s, F f) { #if defined(STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT) STLSOFT_STATIC_ASSERT(stlsoft::has_iterator::value || stlsoft::has_const_iterator::value); #endif /* STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT */ return r_for_each(sequence_range(s), f); } template< ss_typename_param_k S , ss_typename_param_k F > inline void sr_generate(S &s, F f) { r_generate(sequence_range(s), f); } template inline ss_typename_type_ret_k S::value_type sr_max_element(S &s) { STLSOFT_ASSERT(sr_distance(s) > 0); return r_max_element(sequence_range(s)); } template< ss_typename_param_k S , ss_typename_param_k F > inline ss_typename_type_ret_k S::value_type sr_max_element(S &s, F f) { STLSOFT_ASSERT(sr_distance(s) > 0); return r_max_element(sequence_range(s), f); } template inline ss_typename_type_ret_k S::value_type sr_min_element(S &s) { STLSOFT_ASSERT(sr_distance(s) > 0); return r_min_element(sequence_range(s)); } template< ss_typename_param_k S , ss_typename_param_k F > inline ss_typename_type_ret_k S::value_type sr_min_element(S &s, F f) { STLSOFT_ASSERT(sr_distance(s) > 0); return r_min_element(sequence_range(s), f); } template< ss_typename_param_k S , ss_typename_param_k T > inline void sr_replace(S &s, T oldVal, T newVal) { r_replace(sequence_range(s), oldVal, newVal); } template< ss_typename_param_k S , ss_typename_param_k P , ss_typename_param_k T > inline void sr_replace_if(S &s, P pred, T newVal) { r_replace_if(sequence_range(s), pred, newVal); } /* ////////////////////////////////////////////////////////////////////// */ #ifndef RANGELIB_NO_NAMESPACE # if defined(_STLSOFT_NO_NAMESPACE) || \ defined(STLSOFT_DOCUMENTATION_SKIP_SECTION) } // namespace rangelib # else } // namespace rangelib_project } // namespace stlsoft # endif /* _STLSOFT_NO_NAMESPACE */ #endif /* !RANGELIB_NO_NAMESPACE */ /* ////////////////////////////////////////////////////////////////////// */ #endif /* !RANGELIB_INCL_RANGELIB_HPP_SALGORITHMS */ /* ///////////////////////////// end of file //////////////////////////// */