123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- //----------------------------------------------------------------------------
- /// @file pivot.hpp
- /// @brief This file contains the description of several low level algorithms
- ///
- /// @author Copyright (c) 2010 2015 Francisco José Tapia ([email protected] )\n
- /// Distributed under the Boost Software License, Version 1.0.\n
- /// ( See accompanying file LICENSE_1_0.txt or copy at
- /// http://www.boost.org/LICENSE_1_0.txt )
- /// @version 0.1
- ///
- /// @remarks
- //-----------------------------------------------------------------------------
- #ifndef __BOOST_SORT_COMMON_PIVOT_HPP
- #define __BOOST_SORT_COMMON_PIVOT_HPP
- #include <ciso646>
- #include <cstdint>
- namespace boost
- {
- namespace sort
- {
- namespace common
- {
- //
- //##########################################################################
- // ##
- // G L O B A L V A R I B L E S ##
- // ##
- //##########################################################################
- //
- //-----------------------------------------------------------------------------
- // function : mid3
- /// @brief : return the iterator to the mid value of the three values passsed
- /// as parameters
- //
- /// @param iter_1 : iterator to the first value
- /// @param iter_2 : iterator to the second value
- /// @param iter_3 : iterator to the third value
- /// @param comp : object for to compare two values
- /// @return iterator to mid value
- //-----------------------------------------------------------------------------
- template < typename Iter_t, typename Compare >
- inline Iter_t mid3 (Iter_t iter_1, Iter_t iter_2, Iter_t iter_3, Compare comp)
- {
- using std::swap;
- if (comp (*iter_2, *iter_1)) swap ( *iter_2, *iter_1);
- if (comp (*iter_3, *iter_2))
- { swap ( *iter_3, *iter_2);
- if (comp (*iter_2, *iter_1)) swap ( *iter_2, *iter_1);
- };
- return iter_2;
- };
- //
- //-----------------------------------------------------------------------------
- // function : pivot3
- /// @brief : receive a range between first and last, calcule the mid iterator
- /// with the first, the previous to the last, and the central
- /// position. With this mid iterator swap with the first position
- //
- /// @param first : iterator to the first element
- /// @param last : iterator to the last element
- /// @param comp : object for to compare two elements
- //-----------------------------------------------------------------------------
- template < class Iter_t, class Compare >
- inline void pivot3 (Iter_t first, Iter_t last, Compare comp)
- {
- using std::swap;
- auto N2 = (last - first) >> 1;
- Iter_t it_val = mid3 (first + 1, first + N2, last - 1, comp);
- swap (*first, *it_val);
- };
- //
- //-----------------------------------------------------------------------------
- // function : mid9
- /// @brief : return the iterator to the mid value of the nine values passsed
- /// as parameters
- //
- /// @param iter_1 : iterator to the first value
- /// @param iter_2 : iterator to the second value
- /// @param iter_3 : iterator to the third value
- /// @param iter_4 : iterator to the fourth value
- /// @param iter_5 : iterator to the fifth value
- /// @param iter_6 : iterator to the sixth value
- /// @param iter_7 : iterator to the seventh value
- /// @param iter_8 : iterator to the eighth value
- /// @param iter_9 : iterator to the ninth value
- /// @return iterator to the mid value
- //-----------------------------------------------------------------------------
- template < class Iter_t, class Compare >
- inline Iter_t mid9 (Iter_t iter_1, Iter_t iter_2, Iter_t iter_3, Iter_t iter_4,
- Iter_t iter_5, Iter_t iter_6, Iter_t iter_7, Iter_t iter_8,
- Iter_t iter_9, Compare comp)
- {
- return mid3 (mid3 (iter_1, iter_2, iter_3, comp),
- mid3 (iter_4, iter_5, iter_6, comp),
- mid3 (iter_7, iter_8, iter_9, comp), comp);
- };
- //
- //-----------------------------------------------------------------------------
- // function : pivot9
- /// @brief : receive a range between first and last, obtain 9 values between
- /// the elements including the first and the previous to the last.
- /// Obtain the iterator to the mid value and swap with the first
- /// position
- //
- /// @param first : iterator to the first element
- /// @param last : iterator to the last element
- /// @param comp : object for to compare two elements
- //-----------------------------------------------------------------------------
- template < class Iter_t, class Compare >
- inline void pivot9 (Iter_t first, Iter_t last, Compare comp)
- {
- using std::swap;
- size_t cupo = (last - first) >> 3;
- Iter_t itaux = mid9 (first + 1, first + cupo, first + 2 * cupo,
- first + 3 * cupo, first + 4 * cupo, first + 5 * cupo,
- first + 6 * cupo, first + 7 * cupo, last - 1, comp);
- swap (*first, *itaux);
- };
- //****************************************************************************
- };// End namespace common
- };// End namespace sort
- };// End namespace boost
- //****************************************************************************
- #endif
|