diff options
| author | Andre Heinecke <[email protected]> | 2016-04-02 16:06:45 +0000 | 
|---|---|---|
| committer | Andre Heinecke <[email protected]> | 2016-04-02 16:06:45 +0000 | 
| commit | a440050fc2c11e4867da9d4707616fa23ac52141 (patch) | |
| tree | 3875fb6134783a99f6ce4ab05c2f50fe2a599b7a | |
| parent | Add QGpgME code from libkleo (diff) | |
| download | gpgme-a440050fc2c11e4867da9d4707616fa23ac52141.tar.gz gpgme-a440050fc2c11e4867da9d4707616fa23ac52141.zip | |
Add missing files to QGpgME
* lang/qt/src/gpgme_backend_debug.cpp,
 lang/qt/src/gpgme_backend_debug.h,
 lang/qt/src/predicates.h,
 lang/qt/src/stl_util.h: New.
| -rw-r--r-- | lang/qt/src/gpgme_backend_debug.cpp | 10 | ||||
| -rw-r--r-- | lang/qt/src/gpgme_backend_debug.h | 11 | ||||
| -rw-r--r-- | lang/qt/src/predicates.h | 205 | ||||
| -rw-r--r-- | lang/qt/src/stl_util.h | 631 | 
4 files changed, 857 insertions, 0 deletions
| diff --git a/lang/qt/src/gpgme_backend_debug.cpp b/lang/qt/src/gpgme_backend_debug.cpp new file mode 100644 index 00000000..6dfb3135 --- /dev/null +++ b/lang/qt/src/gpgme_backend_debug.cpp @@ -0,0 +1,10 @@ +// This file is autogenerated by CMake: DO NOT EDIT + +#include "gpgme_backend_debug.h" + + +#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0) +Q_LOGGING_CATEGORY(GPGPME_BACKEND_LOG, "log_gpgme_backend", QtWarningMsg) +#else +Q_LOGGING_CATEGORY(GPGPME_BACKEND_LOG, "log_gpgme_backend") +#endif diff --git a/lang/qt/src/gpgme_backend_debug.h b/lang/qt/src/gpgme_backend_debug.h new file mode 100644 index 00000000..5ac93db2 --- /dev/null +++ b/lang/qt/src/gpgme_backend_debug.h @@ -0,0 +1,11 @@ +// This file is autogenerated by CMake: DO NOT EDIT + +#ifndef GPGPME_BACKEND_LOG_H +#define GPGPME_BACKEND_LOG_H + +#include <QLoggingCategory> + +Q_DECLARE_LOGGING_CATEGORY(GPGPME_BACKEND_LOG) + + +#endif diff --git a/lang/qt/src/predicates.h b/lang/qt/src/predicates.h new file mode 100644 index 00000000..74bbe3d2 --- /dev/null +++ b/lang/qt/src/predicates.h @@ -0,0 +1,205 @@ +/* -*- mode: c++; c-basic-offset:4 -*- +    models/predicates.h + +    This file is part of Kleopatra, the KDE keymanager +    Copyright (c) 2007 Klarälvdalens Datakonsult AB +    Copyright (c) 2016 Intevation GmbH + +    Kleopatra is free software; you can redistribute it and/or modify +    it under the terms of the GNU General Public License as published by +    the Free Software Foundation; either version 2 of the License, or +    (at your option) any later version. + +    Kleopatra 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 +    General Public License for more details. + +    You should have received a copy of the GNU General Public License +    along with this program; if not, write to the Free Software +    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + +    In addition, as a special exception, the copyright holders give +    permission to link the code of this program with any edition of +    the Qt library by Trolltech AS, Norway (or with modified versions +    of Qt that use the same license as Qt), and distribute linked +    combinations including the two.  You must obey the GNU General +    Public License in all respects for all of the code used other than +    Qt.  If you modify this file, you may extend this exception to +    your version of the file, but you are not obligated to do so.  If +    you do not wish to do so, delete this exception statement from +    your version. +*/ + +#ifndef __QGPGME_PREDICATES_H__ +#define __QGPGME_PREDICATES_H__ + +#include <stl_util.h> + +#include <string> + +#ifdef BUILDING_QGPGME +# include "global.h" +#else +# include <gpgme++/key.h> +#endif + +#include <boost/bind.hpp> + +#include <cstring> +#include <algorithm> +#include <iterator> + +namespace QGpgME +{ +namespace _detail +{ + +inline int mystrcmp(const char *s1, const char *s2) +{ +    using namespace std; +    return s1 ? s2 ? strcmp(s1, s2) : 1 : s2 ? -1 : 0; +} + +#define make_comparator_str_impl( Name, expr, cmp )                     \ +    template <template <typename U> class Op>                           \ +    struct Name {                                                       \ +        typedef bool result_type;                                       \ +        \ +        bool operator()( const char * lhs, const char * rhs ) const {   \ +            return Op<int>()( cmp, 0 );                                 \ +        }                                                               \ +        \ +        bool operator()( const std::string & lhs, const std::string & rhs ) const { \ +            return operator()( lhs.c_str(), rhs.c_str() );              \ +        }                                                               \ +        bool operator()( const char * lhs, const std::string & rhs ) const { \ +            return operator()( lhs, rhs.c_str() );                      \ +        }                                                               \ +        bool operator()( const std::string & lhs, const char * rhs ) const { \ +            return operator()( lhs.c_str(), rhs );                      \ +        }                                                               \ +        \ +        template <typename T>                                           \ +        bool operator()( const T & lhs, const T & rhs ) const {         \ +            return operator()( (lhs expr), (rhs expr) );                \ +        }                                                               \ +        template <typename T>                                           \ +        bool operator()( const T & lhs, const char * rhs ) const {      \ +            return operator()( (lhs expr), rhs );                       \ +        }                                                               \ +        template <typename T>                                           \ +        bool operator()( const char * lhs, const T & rhs ) const {      \ +            return operator()( lhs, (rhs expr) );                       \ +        }                                                               \ +        template <typename T>                                           \ +        bool operator()( const T & lhs, const std::string & rhs ) const { \ +            return operator()( (lhs expr), rhs );                       \ +        }                                                               \ +        template <typename T>                                           \ +        bool operator()( const std::string & lhs, const T & rhs ) const {    \ +            return operator()( lhs, (rhs expr) );                       \ +        }                                                               \ +    } + +#define make_comparator_str_fast( Name, expr )                          \ +    make_comparator_str_impl( Name, expr, _detail::mystrcmp( lhs, rhs ) ) +#define make_comparator_str( Name, expr )                               \ +    make_comparator_str_impl( Name, expr, qstricmp( lhs, rhs ) ) + +make_comparator_str_fast(ByFingerprint, .primaryFingerprint()); +make_comparator_str_fast(ByKeyID, .keyID()); +make_comparator_str_fast(ByShortKeyID, .shortKeyID()); +make_comparator_str_fast(ByChainID, .chainID()); + +template <typename T> +void sort_by_fpr(T &t) +{ +    std::sort(t.begin(), t.end(), ByFingerprint<std::less>()); +} + +template <typename T> +void remove_duplicates_by_fpr(T &t) +{ +    t.erase(std::unique(t.begin(), t.end(), ByFingerprint<std::equal_to>()), t.end()); +} + +template <typename T> +T union_by_fpr(const T &t1, const T &t2) +{ +    T result; +    result.reserve(t1.size() + t2.size()); +    std::set_union(t1.begin(), t1.end(), +                   t2.begin(), t2.end(), +                   std::back_inserter(result), +                   ByFingerprint<std::less>()); +    return result; +} + +template <typename T> +T union_by_fpr_dirty(const T &t1, const T &t2) +{ +    T cleaned(t1); +    sort_by_fpr(cleaned); +    remove_duplicates_by_fpr(cleaned); +    return union_by_fpr(cleaned, t2); +} + +template <typename T> +void grep_protocol(T &t, GpgME::Protocol proto) +{ +    t.erase(std::remove_if(t.begin(), t.end(), boost::bind(&GpgME::Key::protocol, _1) != proto), t.end()); +} + +template <typename T> +bool any_protocol(const T &t, GpgME::Protocol proto) +{ +    return kdtools::any(t, boost::bind(&GpgME::Key::protocol, _1) == proto); +} + +template <typename T> +bool all_protocol(const T &t, GpgME::Protocol proto) +{ +    return kdtools::all(t, boost::bind(&GpgME::Key::protocol, _1) == proto); +} + +template <typename T> +bool none_of_protocol(const T &t, GpgME::Protocol proto) +{ +    return kdtools::none_of(t, boost::bind(&GpgME::Key::protocol, _1) == proto); +} + +template <typename T> +void grep_secret(T &t) +{ +    t.erase(std::remove_if(t.begin(), t.end(), boost::mem_fn(&GpgME::Key::hasSecret)), t.end()); +} + +template <typename T> +bool any_secret(const T &t) +{ +    return kdtools::any(t, boost::mem_fn(&GpgME::Key::hasSecret)); +} + +template <typename T> +bool all_secret(const T &t) +{ +    return kdtools::all(t, boost::mem_fn(&GpgME::Key::hasSecret)); +} + +template <typename T> +bool none_of_secret(const T &t) +{ +    return kdtools::none_of(t, boost::mem_fn(&GpgME::Key::hasSecret)); +} + +template <typename T> +void grep_can_encrypt(T &t) +{ +    t.erase(std::remove_if(t.begin(), t.end(), !boost::bind(&GpgME::Key::canEncrypt, _1)), t.end()); +} + +} +} + +#endif /* __QGPGME_PREDICATES_H__ */ diff --git a/lang/qt/src/stl_util.h b/lang/qt/src/stl_util.h new file mode 100644 index 00000000..5a5841bf --- /dev/null +++ b/lang/qt/src/stl_util.h @@ -0,0 +1,631 @@ +/**************************************************************************** +** Copyright (C) 2001-2007 Klarälvdalens Datakonsult AB +    Copyright (c) 2016 Intevation GmbH.  All rights reserved. +** +** This file is part of the KD Tools library. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid commercial KD Tools licenses may use this file in +** accordance with the KD Tools Commercial License Agreement provided with +** the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** Contact [email protected] if any conditions of this +** licensing are not clear to you. +** +**********************************************************************/ +#ifndef __KDTOOLSCORE_STL_UTIL_H__ +#define __KDTOOLSCORE_STL_UTIL_H__ + +#include <boost/range.hpp> +#include <boost/iterator/filter_iterator.hpp> +#include <boost/iterator/transform_iterator.hpp> +#include <boost/call_traits.hpp> +#include <boost/version.hpp> + +#include <algorithm> +#include <numeric> +#include <utility> +#include <iterator> +#include <functional> + +namespace kdtools +{ + +struct nodelete { +    template <typename T> +    void operator()(const T *) const {} +}; + +struct identity { +    template <typename T> +    T *operator()(T *t) const +    { +        return t; +    } +    template <typename T> +    const T *operator()(const T *t) const +    { +        return t; +    } +    template <typename T> +    T &operator()(T &t) const +    { +        return t; +    } +    template <typename T> +    const T &operator()(const T &t) const +    { +        return t; +    } +}; + +template <typename Pair> +struct select1st; + +template <typename U, typename V> +struct select1st< std::pair<U, V> > +    : std::unary_function<std::pair<U, V>, U> { +    typename boost::call_traits<U>::param_type +    operator()(const std::pair<U, V> &pair) const +    { +        return pair.first; +    } +}; + +template <typename Pair> +struct select2nd; + +template <typename U, typename V> +struct select2nd< std::pair<U, V> > +    : std::unary_function<std::pair<U, V>, V> { +    typename boost::call_traits<V>::param_type +    operator()(const std::pair<U, V> &pair) const +    { +        return pair.second; +    } +}; + +template <typename InputIterator, typename OutputIterator, typename UnaryPredicate> +OutputIterator copy_if(InputIterator first, InputIterator last, OutputIterator dest, UnaryPredicate pred) +{ +    while (first != last) { +        if (pred(*first)) { +            *dest = *first; +            ++dest; +        } +        ++first; +    } +    return dest; +} + +template <typename OutputIterator, typename InputIterator, typename UnaryFunction, typename UnaryPredicate> +OutputIterator transform_if(InputIterator first, InputIterator last, OutputIterator dest, UnaryPredicate pred, UnaryFunction filter) +{ +    return std::transform(boost::make_filter_iterator(filter, first, last), +                          boost::make_filter_iterator(filter, last,  last), +                          dest, pred); +} + +template <typename InputIterator, typename OutputIterator> +OutputIterator copy_1st(InputIterator first, InputIterator last, OutputIterator dest) +{ +    return std::copy(boost::make_transform_iterator(first, select1st<typename std::iterator_traits<InputIterator>::value_type>()), +                     boost::make_transform_iterator(last,  select1st<typename std::iterator_traits<InputIterator>::value_type>()), +                     dest); +} + +template <typename InputIterator, typename OutputIterator> +OutputIterator copy_2nd(InputIterator first, InputIterator last, OutputIterator dest) +{ +    return std::copy(boost::make_transform_iterator(first, select2nd<typename std::iterator_traits<InputIterator>::value_type>()), +                     boost::make_transform_iterator(last,  select2nd<typename std::iterator_traits<InputIterator>::value_type>()), +                     dest); +} + +template <typename InputIterator, typename OutputIterator, typename Predicate> +OutputIterator copy_1st_if(InputIterator first, InputIterator last, OutputIterator dest, Predicate pred) +{ +    return kdtools::copy_if(boost::make_transform_iterator(first, select1st<typename std::iterator_traits<InputIterator>::value_type>()), +                            boost::make_transform_iterator(last,  select1st<typename std::iterator_traits<InputIterator>::value_type>()), +                            dest, pred); +} + +template <typename InputIterator, typename OutputIterator, typename Predicate> +OutputIterator copy_2nd_if(InputIterator first, InputIterator last, OutputIterator dest, Predicate pred) +{ +    return kdtools::copy_if(boost::make_transform_iterator(first, select2nd<typename std::iterator_traits<InputIterator>::value_type>()), +                            boost::make_transform_iterator(last,  select2nd<typename std::iterator_traits<InputIterator>::value_type>()), +                            dest, pred); +} + +template <typename OutputIterator, typename InputIterator, typename UnaryFunction> +OutputIterator transform_1st(InputIterator first, InputIterator last, OutputIterator dest, UnaryFunction func) +{ +    return std::transform(boost::make_transform_iterator(first, select1st<typename std::iterator_traits<InputIterator>::value_type>()), +                          boost::make_transform_iterator(last,  select1st<typename std::iterator_traits<InputIterator>::value_type>()), +                          dest, func); +} + +template <typename OutputIterator, typename InputIterator, typename UnaryFunction> +OutputIterator transform_2nd(InputIterator first, InputIterator last, OutputIterator dest, UnaryFunction func) +{ +    return std::transform(boost::make_transform_iterator(first, select2nd<typename std::iterator_traits<InputIterator>::value_type>()), +                          boost::make_transform_iterator(last,  select2nd<typename std::iterator_traits<InputIterator>::value_type>()), +                          dest, func); +} + +template <typename Value, typename InputIterator, typename UnaryPredicate> +Value accumulate_if(InputIterator first, InputIterator last, UnaryPredicate filter, const Value &value = Value()) +{ +    return std::accumulate(boost::make_filter_iterator(filter, first, last), +                           boost::make_filter_iterator(filter, last,  last), value); +} + +template <typename Value, typename InputIterator, typename UnaryPredicate, typename BinaryOperation> +Value accumulate_if(InputIterator first, InputIterator last, UnaryPredicate filter, const Value &value, BinaryOperation op) +{ +    return std::accumulate(boost::make_filter_iterator(filter, first, last), +                           boost::make_filter_iterator(filter, last,  last), value, op); +} + +template <typename Value, typename InputIterator, typename UnaryFunction> +Value accumulate_transform(InputIterator first, InputIterator last, UnaryFunction map, const Value &value = Value()) +{ +    return std::accumulate(boost::make_transform_iterator(first, map), +                           boost::make_transform_iterator(last, map), value); +} + +template <typename Value, typename InputIterator, typename UnaryFunction, typename BinaryOperation> +Value accumulate_transform(InputIterator first, InputIterator last, UnaryFunction map, const Value &value, BinaryOperation op) +{ +    return std::accumulate(boost::make_transform_iterator(first, map), +                           boost::make_transform_iterator(last, map), value, op); +} + +template <typename Value, typename InputIterator, typename UnaryFunction, typename UnaryPredicate> +Value accumulate_transform_if(InputIterator first, InputIterator last, UnaryFunction map, UnaryPredicate pred, const Value &value = Value()) +{ +    return std::accumulate(boost::make_transform_iterator(first, map), +                           boost::make_transform_iterator(last, map), value); +} + +template <typename Value, typename InputIterator, typename UnaryFunction, typename UnaryPredicate, typename BinaryOperation> +Value accumulate_transform_if(InputIterator first, InputIterator last, UnaryFunction map, UnaryPredicate filter, const Value &value, BinaryOperation op) +{ +    return std::accumulate(boost::make_transform_iterator(boost::make_filter_iterator(filter, first, last), map), +                           boost::make_transform_iterator(boost::make_filter_iterator(filter, last, last), map), value, op); +} + +template <typename InputIterator, typename OutputIterator1, typename OutputIterator2, typename UnaryPredicate> +std::pair<OutputIterator1, OutputIterator2> separate_if(InputIterator first, InputIterator last, OutputIterator1 dest1, OutputIterator2 dest2, UnaryPredicate pred) +{ +    while (first != last) { +        if (pred(*first)) { +            *dest1 = *first; +            ++dest1; +        } else { +            *dest2 = *first; +            ++dest2; +        } +        ++first; +    } +    return std::make_pair(dest1, dest2); +} + +template <typename InputIterator> +bool any(InputIterator first, InputIterator last) +{ +    while (first != last) +        if (*first) { +            return true; +        } else { +            ++first; +        } +    return false; +} + +template <typename InputIterator, typename UnaryPredicate> +bool any(InputIterator first, InputIterator last, UnaryPredicate pred) +{ +    while (first != last) +        if (pred(*first)) { +            return true; +        } else { +            ++first; +        } +    return false; +} + +template <typename InputIterator> +bool all(InputIterator first, InputIterator last) +{ +    while (first != last) +        if (*first) { +            ++first; +        } else { +            return false; +        } +    return true; +} + +template <typename InputIterator, typename UnaryPredicate> +bool all(InputIterator first, InputIterator last, UnaryPredicate pred) +{ +    while (first != last) +        if (pred(*first)) { +            ++first; +        } else { +            return false; +        } +    return true; +} + +template <typename InputIterator> +bool none_of(InputIterator first, InputIterator last) +{ +    return !any(first, last); +} + +template <typename InputIterator, typename UnaryPredicate> +bool none_of(InputIterator first, InputIterator last, UnaryPredicate pred) +{ +    return !any(first, last, pred); +} + +template <typename InputIterator, typename BinaryOperation> +BinaryOperation for_each_adjacent_pair(InputIterator first, InputIterator last, BinaryOperation op) +{ +    typedef typename std::iterator_traits<InputIterator>::value_type ValueType; +    if (first == last) { +        return op; +    } +    ValueType value = *first; +    while (++first != last) { +        ValueType tmp = *first; +        op(value, tmp); +        value = tmp; +    } +    return op; +} + +template <typename ForwardIterator, typename UnaryPredicate, typename UnaryFunction> +UnaryFunction for_each_if(ForwardIterator first, ForwardIterator last, UnaryPredicate pred, UnaryFunction func) +{ +    return std::for_each(boost::make_filter_iterator(pred, first, last), +                         boost::make_filter_iterator(pred, last, last), +                         func); +} + +//@{ +/** +   Versions of std::set_intersection optimized for ForwardIterator's +*/ +template <typename ForwardIterator, typename ForwardIterator2, typename OutputIterator, typename BinaryPredicate> +OutputIterator set_intersection(ForwardIterator first1, ForwardIterator last1, ForwardIterator2 first2, ForwardIterator2 last2, OutputIterator result) +{ +    while (first1 != last1 && first2 != last2) { +        if (*first1 < *first2) { +            first1 = std::lower_bound(++first1, last1, *first2); +        } else if (*first2 < *first1) { +            first2 = std::lower_bound(++first2, last2, *first1); +        } else { +            *result = *first1; +            ++first1; +            ++first2; +            ++result; +        } +    } +    return result; +} + +template <typename ForwardIterator, typename ForwardIterator2, typename OutputIterator, typename BinaryPredicate> +OutputIterator set_intersection(ForwardIterator first1, ForwardIterator last1, ForwardIterator2 first2, ForwardIterator2 last2, OutputIterator result, BinaryPredicate pred) +{ +    while (first1 != last1 && first2 != last2) { +        if (pred(*first1, *first2)) { +            first1 = std::lower_bound(++first1, last1, *first2, pred); +        } else if (pred(*first2, *first1)) { +            first2 = std::lower_bound(++first2, last2, *first1, pred); +        } else { +            *result = *first1; +            ++first1; +            ++first2; +            ++result; +        } +    } +    return result; +} +//@} + +template <typename ForwardIterator, typename ForwardIterator2, typename BinaryPredicate> +bool set_intersects(ForwardIterator first1,  ForwardIterator last1, +                    ForwardIterator2 first2, ForwardIterator2 last2, +                    BinaryPredicate pred) +{ +    while (first1 != last1 && first2 != last2) { +        if (pred(*first1, *first2)) { +            first1 = std::lower_bound(++first1, last1, *first2, pred); +        } else if (pred(*first2, *first1)) { +            first2 = std::lower_bound(++first2, last2, *first1, pred); +        } else { +            return true; +        } +    } +    return false; +} + +//@{ +/*! Versions of std algorithms that take ranges */ + +template <typename C, typename V> +typename boost::range_iterator<C>::type +find(C &c, const V &v) +{ +    return std::find(boost::begin(c), boost::end(c), v); +} + +#if BOOST_VERSION < 103500 +template <typename C, typename V> +typename boost::range_const_iterator<C>::type +find(const C &c, const V &v) +{ +    return std::find(boost::begin(c), boost::end(c), v); +} +#endif + +template <typename C, typename P> +typename boost::range_iterator<C>::type +find_if(C &c, P p) +{ +    return std::find_if(boost::begin(c), boost::end(c), p); +} + +#if BOOST_VERSION < 103500 +template <typename C, typename P> +typename boost::range_const_iterator<C>::type +find_if(const C &c, P p) +{ +    return std::find_if(boost::begin(c), boost::end(c), p); +} +#endif + +template <typename C, typename V> +bool contains(const C &c, const V &v) +{ +    return find(c, v) != boost::end(c); +} + +template <typename C, typename P> +bool contains_if(const C &c, P p) +{ +    return find_if(c, p) != boost::end(c); +} + +template <typename C, typename V> +bool binary_search(const C &c, const V &v) +{ +    return std::binary_search(boost::begin(c), boost::end(c), v); +} + +template <typename C, typename V> +size_t count(const C &c, const V &v) +{ +    return std::count(boost::begin(c), boost::end(c), v); +} + +template <typename C, typename P> +size_t count_if(const C &c, P p) +{ +    return std::count_if(boost::begin(c), boost::end(c), p); +} + +template <typename O, typename I, typename P> +O transform(const I &i, P p) +{ +    O o; +    std::transform(boost::begin(i), boost::end(i), +                   std::back_inserter(o), p); +    return o; +} + +template <typename I, typename OutputIterator, typename P> +OutputIterator transform(const I &i, OutputIterator out, P p) +{ +    return std::transform(boost::begin(i), boost::end(i), out, p); +} + +template <typename O, typename I, typename P, typename F> +O transform_if(const I &i, P p, F f) +{ +    O o; +    transform_if(boost::begin(i), boost::end(i), +                 std::back_inserter(o), p, f); +    return o; +} + +template <typename V, typename I, typename F> +V accumulate_if(const I &i, F f, V v = V()) +{ +    return accumulate_if(boost::begin(i), boost::end(i), f, v); +} + +template <typename V, typename I, typename F, typename B> +V accumulate_if(const I &i, F f, V v, B b) +{ +    return accumulate_if(boost::begin(i), boost::end(i), f, v, b); +} + +template <typename V, typename I, typename F> +V accumulate_transform(const I &i, F f, V v = V()) +{ +    return accumulate_transform(boost::begin(i), boost::end(i), f, v); +} + +template <typename V, typename I, typename F, typename B> +V accumulate_transform(const I &i, F f, V v, B b) +{ +    return accumulate_transform(boost::begin(i), boost::end(i), f, v, b); +} + +template <typename V, typename I, typename F, typename P> +V accumulate_transform_if(const I &i, F f, P p, V v = V()) +{ +    return accumulate_transform_if(boost::begin(i), boost::end(i), f, p, v); +} + +template <typename V, typename I, typename F, typename P, typename B> +V accumulate_transform_if(const I &i, F f, P p, V v, B b) +{ +    return accumulate_transform_if(boost::begin(i), boost::end(i), f, p, v, b); +} + +template <typename O, typename I> +O copy(const I &i) +{ +    O o; +    std::copy(boost::begin(i), boost::end(i), std::back_inserter(o)); +    return o; +} + +template <typename O, typename I, typename P> +O copy_if(const I &i, P p) +{ +    O o; +    kdtools::copy_if(boost::begin(i), boost::end(i), std::back_inserter(o), p); +    return o; +} + +template <typename I, typename P> +P for_each(const I &i, P p) +{ +    return std::for_each(boost::begin(i), boost::end(i), p); +} + +template <typename I, typename P> +P for_each(I &i, P p) +{ +    return std::for_each(boost::begin(i), boost::end(i), p); +} + +template <typename C1, typename C2> +bool equal(const C1 &c1, const C2 &c2) +{ +    return boost::size(c1) == boost::size(c2) +           && std::equal(boost::begin(c1), boost::end(c1), +                         boost::begin(c2)); +} + +template <typename C1, typename C2, typename P> +bool equal(const C1 &c1, const C2 &c2, P p) +{ +    return boost::size(c1) == boost::size(c2) +           && std::equal(boost::begin(c1), boost::end(c1), +                         boost::begin(c2), p); +} + +template <typename C, typename O1, typename O2, typename P> +std::pair<O1, O2> separate_if(const C &c, O1 o1, O2 o2, P p) +{ +    return separate_if(boost::begin(c), boost::end(c), o1, o2, p); +} + +//@} + +template <typename C> +bool any(const C &c) +{ +    return any(boost::begin(c), boost::end(c)); +} + +template <typename C, typename P> +bool any(const C &c, P p) +{ +    return any(boost::begin(c), boost::end(c), p); +} + +template <typename C> +bool all(const C &c) +{ +    return all(boost::begin(c), boost::end(c)); +} + +template <typename C, typename P> +bool all(const C &c, P p) +{ +    return all(boost::begin(c), boost::end(c), p); +} + +template <typename C> +bool none_of(const C &c) +{ +    return none_of(boost::begin(c), boost::end(c)); +} + +template <typename C, typename P> +bool none_of(const C &c, P p) +{ +    return kdtools::none_of(boost::begin(c), boost::end(c), p); +} + +template <typename C, typename B> +B for_each_adjacent_pair(const C &c, B b) +{ +    return for_each_adjacent_pair(boost::begin(c), boost::end(c), b); +} + +template <typename C, typename B> +B for_each_adjacent_pair(C &c, B b) +{ +    return for_each_adjacent_pair(boost::begin(c), boost::end(c), b); +} + +template <typename C, typename P, typename F> +P for_each_if(const C &c, P p, F f) +{ +    return for_each_if(boost::begin(c), boost::end(c), p, f); +} + +template <typename C, typename P, typename F> +P for_each_if(C &c, P p, F f) +{ +    return for_each_if(boost::begin(c), boost::end(c), p, f); +} + +template <typename C> +void sort(C &c) +{ +    return std::sort(boost::begin(c), boost::end(c)); +} + +template <typename C, typename P> +void sort(C &c, P p) +{ +    return std::sort(boost::begin(c), boost::end(c), p); +} + +template <typename C> +C sorted(const C &c) +{ +    C copy(c); +    kdtools::sort(copy); +    return copy; +} + +template <typename C, typename P> +C sorted(const C &c, P p) +{ +    C copy(c); +    kdtools::sort(copy, p); +    return copy; +} + +} + +#endif /* __KDTOOLSCORE_STL_UTIL_H__ */ | 
