basic_indirect_range_adaptor.hpp

来自「用STL的方式封装了WindowsAPI、COM调用、ACE、ATL、MFC、W」· HPP 代码 · 共 648 行 · 第 1/2 页

HPP
648
字号
/* /////////////////////////////////////////////////////////////////////////
 * File:        rangelib/basic_indirect_range_adaptor.hpp
 *
 * Purpose:     basic_indirect_range_adaptor.
 *
 * Created:     4th November 2003
 * Updated:     10th June 2006
 *
 * Home:        http://stlsoft.org/
 *
 * Copyright (c) 2003-2006, 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/basic_indirect_range_adaptor.hpp basic_indirect_range_adaptor */

#ifndef RANGELIB_INCL_RANGELIB_HPP_BASIC_INDIRECT_RANGE_ADAPTOR
#define RANGELIB_INCL_RANGELIB_HPP_BASIC_INDIRECT_RANGE_ADAPTOR

#ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
# define RANGELIB_VER_RANGELIB_HPP_BASIC_INDIRECT_RANGE_ADAPTOR_MAJOR      2
# define RANGELIB_VER_RANGELIB_HPP_BASIC_INDIRECT_RANGE_ADAPTOR_MINOR      1
# define RANGELIB_VER_RANGELIB_HPP_BASIC_INDIRECT_RANGE_ADAPTOR_REVISION   1
# define RANGELIB_VER_RANGELIB_HPP_BASIC_INDIRECT_RANGE_ADAPTOR_EDIT       24
#endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */

/* /////////////////////////////////////////////////////////////////////////
 * Auto-generation and compatibility
 */

/*
[Incompatibilies-start]
STLSOFT_COMPILER_IS_MSVC:     _MSC_VER < 1200
STLSOFT_COMPILER_IS_MWERKS:   (__MWERKS__ & 0xFF00) < 0x3000
[Incompatibilies-end]
 */

/* /////////////////////////////////////////////////////////////////////////
 * Includes
 */

#ifndef RANGELIB_INCL_RANGELIB_HPP_RANGELIB
# include <rangelib/rangelib.hpp>
#endif /* !RANGELIB_INCL_RANGELIB_HPP_RANGELIB */
#ifndef RANGELIB_INCL_RANGELIB_HPP_RANGE_CATEGORIES
# include <rangelib/range_categories.hpp>
#endif /* !RANGELIB_INCL_RANGELIB_HPP_RANGE_CATEGORIES */
#include <iterator>
#include <functional>

/* /////////////////////////////////////////////////////////////////////////
 * 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
 */

#ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
namespace
{
    template <ss_typename_param_k T>
    struct accumulate_1_function
    {
    public:
        accumulate_1_function(T &total)
            : m_total(total)
        {}

    public:
        template <ss_typename_param_k T2>
        ss_bool_t operator ()(T2 val)
        {
            m_total = m_total + val;

            return true;
        }

    private:
        T   &m_total;
    };

    template<   ss_typename_param_k T
            ,   ss_typename_param_k P
            >
    struct accumulate_2_function
    {
    public:
        accumulate_2_function(T &total, P pr)
            : m_total(total)
            , m_pr(pr)
        {}

    public:
        template <ss_typename_param_k T2>
        ss_bool_t operator ()(T2 val)
        {
            m_total = m_pr(m_total, val);

            return true;
        }

    private:
        T   &m_total;
        P   m_pr;
    };

    template <ss_typename_param_k O>
    struct copy_function
    {
    public:
        copy_function(O o)
            : m_o(o)
        {}

    public:
        template <ss_typename_param_k T2>
        ss_bool_t operator ()(T2 val)
        {
            *m_o++ = val;

            return true;
        }

    public:
        operator O()
        {
            return m_o;
        }

    private:
        O   m_o;
    };

    template<   ss_typename_param_k O
            ,   ss_typename_param_k P
            >
    struct copy_if_function
    {
    public:
        copy_if_function(O o, P pr)
            : m_o(o)
            , m_pr(pr)
        {}

    public:
        template <ss_typename_param_k T2>
        ss_bool_t operator ()(T2 val)
        {
            if(m_pr(val))
            {
                *m_o++ = val;
            }

            return true;
        }

    public:
        operator O()
        {
            return m_o;
        }

    private:
        O   m_o;
        P   m_pr;
    };

    template <ss_typename_param_k T>
    struct count_function
    {
    public:
        count_function(size_t &n, T const &val)
            : m_n(n)
            , m_val(val)
        {}

    public:
        template <ss_typename_param_k T2>
        ss_bool_t operator ()(T2 val) const
        {
            if(m_val == val)
            {
                ++m_n;
            }

            return true;
        }
    private:
        size_t  &m_n;
        T const &m_val;
    };

    template <ss_typename_param_k P>
    struct count_if_function
    {
    public:
        count_if_function(size_t &n, P pr)
            : m_n(n)
            , m_pr(pr)
        {}

    public:
        template <ss_typename_param_k T2>
        ss_bool_t operator ()(T2 val) const
        {
            if(m_pr(val))
            {
                ++m_n;
            }

            return true;
        }
    private:
        size_t  &m_n;
        P       m_pr;
    };

    struct distance_function
    {
    public:
        distance_function(ptrdiff_t &count)
            : m_count(count)
        {}
    public:
        template <ss_typename_param_k T>
        ss_bool_t operator ()(T /* v */) const
        {
            return (++m_count, true);
        }
    private:
        ptrdiff_t   &m_count;

    private:
        distance_function &operator =(distance_function const &);
    };

    template <ss_typename_param_k T>
    struct exists_function
    {
    public:
        exists_function(ss_bool_t &b, T const &val)
            : m_b(b)
            , m_val(val)
        {
            STLSOFT_ASSERT(!b);
        }

    public:
        template <ss_typename_param_k T2>
        ss_bool_t operator ()(T2 val) const
        {
            if(m_val == val)
            {
                m_b = true;

                return false; // break out of loop
            }

            return true;
        }
    private:
        ss_bool_t   &m_b;
        T const     &m_val;
    };

    template <ss_typename_param_k P>
    struct exists_if_1_function
    {
    public:
        exists_if_1_function(ss_bool_t &b, P pr)
            : m_b(b)
            , m_pr(pr)
        {
            STLSOFT_ASSERT(!b);
        }

    public:
        template <ss_typename_param_k T2>
        ss_bool_t operator ()(T2 val) const

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?