summaryrefslogtreecommitdiffstats
path: root/include/std/algorithm
diff options
context:
space:
mode:
Diffstat (limited to 'include/std/algorithm')
-rw-r--r--include/std/algorithm762
1 files changed, 0 insertions, 762 deletions
diff --git a/include/std/algorithm b/include/std/algorithm
deleted file mode 100644
index e47671fd..00000000
--- a/include/std/algorithm
+++ /dev/null
@@ -1,762 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/include/algorithm $ */
-/* */
-/* OpenPOWER HostBoot Project */
-/* */
-/* Contributors Listed Below - COPYRIGHT 2011,2014 */
-/* [+] International Business Machines Corp. */
-/* */
-/* */
-/* Licensed under the Apache License, Version 2.0 (the "License"); */
-/* you may not use this file except in compliance with the License. */
-/* You may obtain a copy of the License at */
-/* */
-/* http://www.apache.org/licenses/LICENSE-2.0 */
-/* */
-/* Unless required by applicable law or agreed to in writing, software */
-/* distributed under the License is distributed on an "AS IS" BASIS, */
-/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
-/* implied. See the License for the specific language governing */
-/* permissions and limitations under the License. */
-/* */
-/* IBM_PROLOG_END_TAG */
-#ifndef ALGORITHM
-#define ALGORITHM
-
-#include <iterator>
-#include <util/impl/qsort.H>
-#include <type_traits>
-
-#ifdef __cplusplus
-namespace std
-{
- /**
- * Copy a range of elements
- * @param[in] first InputIterator to the initial position in the source sequence.
- * @param[in] last InputIterator to last position + 1 in the source sequence.
- * @param[in] result OutputIterator to initial position in the destination sequence.
- * @return an iterator to the last element in the destination range
- * @note If both ranges overlap in such a way that result points to an elmenent in the source
- * range then fuction copy_backward should be used.
- */
- template <class InputIterator, class OutputIterator>
- inline OutputIterator
- copy (InputIterator first, InputIterator last, OutputIterator result )
- {
- while(first!=last)
- {
- *result = *first;
- ++result;
- ++first;
- }
- return result;
- }
-
- /**
- * Copy a range of elements backwards
- * @param[in] first Bidirectional iterator to the initial source position
- * @param[in] last Bidirectional iterator to the final source position + 1
- * @param[in] result Bidirectional iterator to end of the destination sequence + 1.
- * @return an iterator to the first element in the destination sequence.
- * @note If both ranges overlap in such a way that result points to an element in the source
- * range, the function copy should be used instead.
- */
- template <class BidirectionalIterator1, class BidirectionalIterator2>
- inline BidirectionalIterator2
- copy_backward ( BidirectionalIterator1 first,
- BidirectionalIterator1 last,
- BidirectionalIterator2 result )
- {
- while(last!=first)
- {
- --result;
- --last;
- *result = *last;
- }
- return result;
- }
-
- /**
- * Exchange values of two objects
- * @param[in] a reference to an object to be swaped with b
- * @param[in] b reference to an object to be swaped with a
- * @note this function may not be an efficient way to swap large objects.
- */
- template <class T>
- inline void
- swap(T& a, T&b )
- {
- T c(a);
- a=b;
- b=c;
- }
-
- /**
- * Fill a range with value
- * @param[in] first ForwardIterator to the first position in the source range.
- * @param[in] last ForwardIterator to the last position +1 in the source range.
- * @param[in] value reference to the object used to fill the sequence.
- */
- template < class ForwardIterator, class T >
- inline void
- fill (ForwardIterator first, ForwardIterator last, const T& value )
- {
- while (first != last)
- {
- *first = value;
- ++first;
- }
- }
-
- /**
- * Fill a sequence with value
- * @param[in] first OutputIterator to the first position in the sequence.
- * @param[in] n number of elements in the sequence
- * @param[in] value reference to the value used to fill the sequence.
- */
- template < class OutputIterator, class Size, class T >
- inline void
- fill_n( OutputIterator first, Size n, const T& value )
- {
- for(; n>0; --n)
- {
- *first = value;
- ++first;
- }
- }
-
- /**
- * Fill a sequence with a generated value
- * @param[in] first OutputIterator to the first position in the sequence.
- * @param[in] n number of elements in the sequence
- * @param[in] gen functor to create values used to fill the sequence.
- */
- template <typename OutputIterator, typename Size, typename Generator>
- OutputIterator generate_n(OutputIterator first, Size n, Generator gen)
- {
- for(; n>0; --n)
- {
- *first = gen();
- ++first;
- }
-
- return first;
- }
-
- /**
- * Return the lesser of two arguments
- * @param[in] a object reference
- * @param[in] b object reference
- * @return reference to te lesser object
- */
- template <class T>
- inline const T&
- min(const T& a, const T& b)
- {
- if( b < a) return b;
- return a;
- }
-
- /**
- * Return the greater of two arguments
- * @param[in] a object reference
- * @param[in] b object reference
- * @return reference to te greater object
- */
- template <class T>
- inline const T&
- max(const T& a, const T& b)
- {
- if(a < b) return b;
- return a;
- }
-
- /**
- * Find the location of an element within a range.
- * @param[in] first InputIterator to the first position in the range.
- * @param[in] last InputIterator to the last position in the range.
- * @param[in] value Value to use for comparison.
- *
- * Returns the first iterator i in the range [first,last) such that
- * (*i == value) or else last if no element is found.
- *
- * @return An iterator in the range [first,last]. last implies that no
- * matching element was found.
- */
- template <typename InputIterator, typename EqualityComparable>
- inline InputIterator
- find(InputIterator first, InputIterator last,
- const EqualityComparable& value)
- {
- while(first != last)
- {
- if ((*first) == value)
- return first;
-
- ++first;
- }
-
- return last;
- }
-
- /**
- * Find the location of an element within a range.
- * @param[in] first InputIterator to the first position in the range.
- * @param[in] last InputIterator to the last position in the range.
- * @param[in] pred Predicate used to compare equality.
- *
- * Returns the first iterator i in the range [first,last) such that
- * pred(*i) is true or else last if no element is found.
- *
- * @return An iterator in the range [first,last]. last implies that no
- * matching element was found.
- */
- template <typename InputIterator, typename Predicate>
- inline InputIterator
- find_if(InputIterator first, InputIterator last,
- Predicate pred)
- {
- while(first != last)
- {
- if (pred(*first))
- return first;
-
- ++first;
- }
-
- return last;
- }
-
- /**
- * Find the minimum element within a range.
- * @param[in] first - FwdIterator to the first position in the range.
- * @param[in] last - FwdIterator to the last position in the range.
- *
- * Returns the first element (i) such that (*j) < (*i) is false for all
- * other iterators.
- *
- * The iterator last is returned only when the range contains no elements.
- *
- * @return An iterator in [first, last) containing the minimum element.
- *
- */
- template <typename FwdIterator>
- inline FwdIterator min_element(FwdIterator first, FwdIterator last)
- {
- if (first == last) return last;
- FwdIterator e = first++;
- while(first != last)
- {
- if ((*first) < (*e))
- {
- e = first;
- }
- ++first;
- }
- return e;
- }
-
- /**
- * Find the minimum element within a range.
- * @param[in] first - FwdIterator to the first position in the range.
- * @param[in] last - FwdIterator to the last position in the range.
- * @param[in] comp - BinaryPredicate used to perform comparison.
- *
- * Returns the first element (i) such that comp(*j,*i) is false for all
- * other iterators.
- *
- * The iterator last is returned only when the range contains no elements.
- *
- * @return An iterator in [first, last) containing the minimum element.
- *
- */
- template <typename FwdIterator, typename BinaryPredicate>
- inline FwdIterator min_element(FwdIterator first, FwdIterator last,
- BinaryPredicate comp)
- {
- if (first == last) return last;
- FwdIterator e = first++;
- while(first != last)
- {
- if (comp((*first),(*e)))
- {
- e = first;
- }
- ++first;
- }
- return e;
- }
-
- /**
- * Find the maximum element within a range.
- * @param[in] first - FwdIterator to the first position in the range.
- * @param[in] last - FwdIterator to the last position in the range.
- *
- * Returns the first element (i) such that (*i) < (*j) is false for all
- * other iterators.
- *
- * The iterator last is returned only when the range contains no elements.
- *
- * @return An iterator in [first, last) containing the minimum element.
- *
- */
- template <typename FwdIterator>
- inline FwdIterator max_element(FwdIterator first, FwdIterator last)
- {
- if (first == last) return last;
- FwdIterator e = first++;
- while(first != last)
- {
- if ((*e) < (*first))
- {
- e = first;
- }
- ++first;
- }
- return e;
- }
-
- /**
- * Find the maximum element within a range.
- * @param[in] first - FwdIterator to the first position in the range.
- * @param[in] last - FwdIterator to the last position in the range.
- * @param[in] comp - BinaryPredicate used to perform comparison.
- *
- * Returns the first element (i) such that comp(*i,*j) is false for all
- * other iterators.
- *
- * The iterator last is returned only when the range contains no elements.
- *
- * @return An iterator in [first, last) containing the minimum element.
- *
- */
- template <typename FwdIterator, typename BinaryPredicate>
- inline FwdIterator max_element(FwdIterator first, FwdIterator last,
- BinaryPredicate comp)
- {
- if (first == last) return last;
- FwdIterator e = first++;
- while(first != last)
- {
- if (comp((*e),(*first)))
- {
- e = first;
- }
- ++first;
- }
- return e;
- }
-
-
- /**
- * Find the element value in an ordered range [first, last]. Specifically,
- * it returns the first position where value could be inserted without
- * violating the ordering.
- *
- * @param[in] first ForwardIterator to the first position in the range.
- * @param[in] last ForwardIterator to the last position in the range.
- * @param[in] value Value to use for comparison.
- */
-
- template <class ForwardIterator, class LessThanComparable>
- inline ForwardIterator
- lower_bound ( ForwardIterator first,
- ForwardIterator last,
- const LessThanComparable& value )
- {
- ForwardIterator it;
- int num = 0x0;
- int range = std::distance<ForwardIterator>( first,
- last );
-
- while( range > 0 )
- {
- it = first;
- num = range / 2;
- std::advance( it, num );
-
- if( (*it) < value )
- {
- first = ++it;
- range = (range - (num+1));
- }
- else
- {
- range = num;
- }
- }
-
- return first;
- }
-
- /**
- * Find the element value in an ordered range [first, last]. Specifically,
- * it returns the first position where value could be inserted without
- * violating the ordering. This is done using the comparison function
- * parameter that is passed in.
- *
- * @param[in] first ForwardIterator to the first position in the range.
- * @param[in] last ForwardIterator to the last position in the range.
- * @param[in] value Value to use for comparison.
- * @param[in] comp Function to do the comparison
- */
- template <class ForwardIterator, class T, class StrictWeakOrdering>
- inline ForwardIterator
- lower_bound ( ForwardIterator first,
- ForwardIterator last,
- const T& value,
- StrictWeakOrdering comp )
- {
- ForwardIterator it;
- int num = 0x0;
- int range = std::distance<ForwardIterator>( first,
- last );
-
- while( range > 0 )
- {
- it = first;
- num = range / 2;
- std::advance( it, num );
-
- if( comp( (*it), value ) )
- {
- first = ++it;
- range = (range - (num+1));
- }
- else
- {
- range = num;
- }
- }
-
- return first;
- }
-
- /**
- * Apply a functor to each element in a range.
- *
- * Applies functor 'f' to each element in [first, last).
- *
- * @param[in] first - The beginning of the range.
- * @param[in] last - The end of the range.
- * @param[in] f - The functor.
- *
- * @return The functor after being having been applied.
- */
- template <typename InputIterator, typename UnaryFunction>
- UnaryFunction for_each(InputIterator first, InputIterator last,
- UnaryFunction f)
- {
- while(first != last)
- {
- f(*first);
- ++first;
- }
- return f;
- }
-
- /**
- * Remove a value from a range.
- *
- * Removes all instances matching 'value' in the range [first, last)
- * and returns an iterator to the end of the new range [first, new_last)
- * where nothing in the new range has 'value'.
- *
- * Remove does not decrease the size of the container.
- *
- * @param[in] first - The beginning of the range.
- * @param[in] last - The end of the range.
- * @param[in] value - The value to remove.
- *
- * @return An iterator 'new_last' from [first, new_last).
- */
- template <typename ForwardIterator, typename T>
- ForwardIterator remove(ForwardIterator first, ForwardIterator last,
- const T& value)
- {
- // Find first match.
- first = find(first, last, value);
-
- if (first == last) // No match found, return un-changed 'last'.
- {
- return last;
- }
-
- // Match was found. 'new_last' is now the first removed element.
- ForwardIterator new_last = first;
- ++first;
-
- // Iterate through all the others.
- while(first != last)
- {
- // If 'first' is a desired value, we need to copy it and move
- // 'new_last'.
- if (!(*first == value))
- {
- *new_last = *first;
- ++new_last;
- }
-
- ++first;
- }
-
- return new_last;
-
- }
-
- /**
- * Remove a value from a range using a predicate.
- *
- * Removes all instances pred(*i) is true in the range [first, last)
- * and returns an iterator to the end of the new range [first, new_last)
- * where nothing in the new range has pred(*i) true.
- *
- * Remove does not decrease the size of the container.
- *
- * @param[in] first - The beginning of the range.
- * @param[in] last - The end of the range.
- * @param[in] pred - The predicate to use for comparison.
- *
- * @return An iterator 'new_last' from [first, new_last).
- */
- template <typename ForwardIterator, typename Predicate>
- ForwardIterator remove_if(ForwardIterator first, ForwardIterator last,
- Predicate pred)
- {
- // Find first match.
- first = find_if(first, last, pred);
-
- if (first == last) // No match found, return un-changed 'last'.
- {
- return last;
- }
-
- // Match was found. 'new_last' is now the first removed element.
- ForwardIterator new_last = first;
- ++first;
-
- // Iterate through all the others.
- while(first != last)
- {
- // If 'first' is a desired value, we need to copy it and move
- // 'new_last'.
- if (!(pred(*first)))
- {
- *new_last = *first;
- ++new_last;
- }
-
- ++first;
- }
-
- return new_last;
-
- }
-
- /**
- * Removes consecutive duplicate entries from a range.
- *
- * Removes all instances where (*i == *(i-1)) in the range [first, last)
- * and returns an iterator to the end of the new range [first, new_last)
- * where nothing in the new range is a consecutive duplicate.
- *
- * Unique does not decrease the size of the container.
- *
- * @param[in] first - The beginning of the range.
- * @param[in] last - The end of the range.
- *
- * @return An iterator 'new_last' from [first, new_last).
- *
- */
- template <typename ForwardIterator>
- ForwardIterator unique(ForwardIterator first, ForwardIterator last)
- {
- // Trivial case of 0 items, return.
- if (first == last) return last;
-
- // The algorithm keeps 3 iterators 'prev', 'first', and 'last'. The
- // 'prev' iterator is always the last instance to be kept. 'last' is
- // the end of the original range. 'first' is kept to be the item
- // being compared.
-
- // Point 'prev' at the first element of the range since first item is
- // a keeper.
- ForwardIterator prev = first;
- ++first;
-
- while (first != last)
- {
- // If the two items are not the same, we found a new item to keep.
- if (!(*prev == *first))
- {
- // Increment the "keep slot".
- ++prev;
-
- // If the "keep slot" is not the element being compared, we
- // need to move the new item down to that keep slot.
- if (prev != first)
- {
- *prev = *first;
- }
- }
-
- // Advance to the next element.
- ++first;
- }
-
- // 'prev' points to the last item to be kept. Increment it to make
- // it point to the one past.
- ++prev;
- return prev;
- }
-
- /**
- * Removes consecutive duplicate entries from a range by predicate.
- *
- * Removes all instances where pred(*i,*(i-1)) is true in the
- * range [first, last) and returns an iterator to the end of the new
- * range [first, new_last) where nothing in the new range is a
- * consecutive duplicate.
- *
- * Unique does not decrease the size of the container.
- *
- * @param[in] first - The beginning of the range.
- * @param[in] last - The end of the range.
- * @param[in] pred - The predicate.
- *
- * @return An iterator 'new_last' from [first, new_last).
- *
- */
- template <typename ForwardIterator, typename BinaryPredicate>
- ForwardIterator unique(ForwardIterator first, ForwardIterator last,
- BinaryPredicate pred)
- {
- // Trivial case of 0 items, return.
- if (first == last) return last;
-
- // The algorithm keeps 3 iterators 'prev', 'first', and 'last'. The
- // 'prev' iterator is always the last instance to be kept. 'last' is
- // the end of the original range. 'first' is kept to be the item
- // being compared.
-
- // Point 'prev' at the first element of the range since first item is
- // a keeper.
- ForwardIterator prev = first;
- ++first;
-
- while (first != last)
- {
- // If the two items are not the same, we found a new item to keep.
- if (!(pred(*prev,*first)))
- {
- // Increment the "keep slot".
- ++prev;
-
- // If the "keep slot" is not the element being compared, we
- // need to move the new item down to that keep slot.
- if (prev != first)
- {
- *prev = *first;
- }
- }
-
- // Advance to the next element.
- ++first;
- }
-
- // 'prev' points to the last item to be kept. Increment it to make
- // it point to the one past.
- ++prev;
- return prev;
- }
-
- /** Sort a range.
- *
- * Sorts all the elements in [first, last) using such that *i < *(i+1)
- * for all items in the range.
- *
- * @param[in] first - The beginning of the range.
- * @param[in] last - The end of the range.
- */
- template <typename RandomAccessIterator>
- void sort(RandomAccessIterator first, RandomAccessIterator last)
- {
- Util::__Util_QSort_Impl::sort(first, last);
- }
-
- /** Sort a range using a predicate
- *
- * Sorts all the elements in [first, last) using such that
- * pred(*i, *(i+1)) is true for all items in the range.
- *
- * @param[in] first - The beginning of the range.
- * @param[in] last - The end of the range.
- * @param[in] pred - The predicate to use for comparison.
- */
- template <typename RandomAccessIterator, typename StrictWeakOrdering>
- void sort(RandomAccessIterator first, RandomAccessIterator last,
- StrictWeakOrdering pred)
- {
- Util::__Util_QSort_Impl::sort(first, last, pred);
- }
-
- /** Transform one sequence into another.
- *
- * Executes an operator against all elements in [first, last) and writes
- * the result to another sequence.
- *
- * @param first - Beginning of the input range.
- * @param last - Ending of the input range.
- * @param result - Beginning of the output range.
- * @param op - The transformation operator.
- */
- template <typename InputIterator, typename OutputIterator,
- typename UnaryFunction>
- OutputIterator transform(InputIterator first, InputIterator last,
- OutputIterator result, UnaryFunction op)
- {
- while (first != last)
- {
- *result = op(*first);
- ++result;
- ++first;
- }
- return result;
- }
-
- /** Transform two sequences into another.
- *
- * Executes an operator against all elements in [first1, last1) along
- * with the peer from [first2, ...) and writes the result to
- * another sequence.
- *
- * @param first1 - Beginning of the first input range.
- * @param last1 - Ending of the first input range.
- * @param first2 - Beginning of the second input range.
- * @param result - Beginning of the output range.
- * @param op - The transformation operator.
- */
- template <typename InputIterator1, typename InputIterator2,
- typename OutputIterator, typename BinaryFunction>
- OutputIterator transform(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, OutputIterator result,
- BinaryFunction op)
- {
- while (first1 != last1)
- {
- *result = op(*first1, *first2);
- ++result;
- ++first1; ++first2;
- }
- return result;
- }
-
-
-
-};
-#endif
-
-#endif
-/* vim: set filetype=cpp : */
OpenPOWER on IntegriCloud