diff --git a/sprout/algorithm/cxx14.hpp b/sprout/algorithm/cxx14.hpp index 467fdd15..8a12fb0e 100644 --- a/sprout/algorithm/cxx14.hpp +++ b/sprout/algorithm/cxx14.hpp @@ -48,16 +48,16 @@ #include #include #include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include diff --git a/sprout/algorithm/cxx14/detail/heap_tool.hpp b/sprout/algorithm/cxx14/detail/heap_tool.hpp new file mode 100644 index 00000000..d31dc293 --- /dev/null +++ b/sprout/algorithm/cxx14/detail/heap_tool.hpp @@ -0,0 +1,85 @@ +/*============================================================================= + Copyright (c) 2011-2014 Bolero MURAKAMI + https://github.com/bolero-MURAKAMI/Sprout + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ +#ifndef SPROUT_ALGORITHM_CXX14_DETAIL_HEAP_TOOL_HPP +#define SPROUT_ALGORITHM_CXX14_DETAIL_HEAP_TOOL_HPP + +#include +#include +#include + +namespace sprout { + namespace detail { + template + inline SPROUT_CXX14_CONSTEXPR void + push_heap_front( + RandomAccessIterator first, RandomAccessIterator, Compare comp, + typename std::iterator_traits::difference_type len + ) + { + typedef typename std::iterator_traits::difference_type difference_type; + typedef typename std::iterator_traits::value_type value_type; + if (len > 1) { + difference_type p = 0; + RandomAccessIterator pp = first; + difference_type c = 2; + RandomAccessIterator cp = first + c; + if (c == len || comp(*cp, *(cp - 1))) { + --c; + --cp; + } + if (comp(*pp, *cp)) { + value_type t(sprout::move(*pp)); + do { + *pp = sprout::move(*cp); + pp = cp; + p = c; + c = (p + 1) * 2; + if (c > len) { + break; + } + cp = first + c; + if (c == len || comp(*cp, *(cp - 1))) { + --c; + --cp; + } + } while (comp(t, *cp)); + *pp = sprout::move(t); + } + } + } + template + inline SPROUT_CXX14_CONSTEXPR void + push_heap_back( + RandomAccessIterator first, RandomAccessIterator last, Compare comp, + typename std::iterator_traits::difference_type len + ) + { + typedef typename std::iterator_traits::difference_type difference_type; + typedef typename std::iterator_traits::value_type value_type; + if (len > 1) { + len = (len - 2) / 2; + RandomAccessIterator ptr = first + len; + if (comp(*ptr, *--last)) { + value_type t(sprout::move(*last)); + do { + *last = sprout::move(*ptr); + last = ptr; + if (len == 0) { + break; + } + len = (len - 1) / 2; + ptr = first + len; + } while (comp(*ptr, t)); + *last = sprout::move(t); + } + } + } + } // namespace detail +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_CXX14_DETAIL_HEAP_TOOL_HPP diff --git a/sprout/algorithm/cxx14/make_heap.hpp b/sprout/algorithm/cxx14/make_heap.hpp new file mode 100644 index 00000000..42536583 --- /dev/null +++ b/sprout/algorithm/cxx14/make_heap.hpp @@ -0,0 +1,53 @@ +/*============================================================================= + Copyright (c) 2011-2014 Bolero MURAKAMI + https://github.com/bolero-MURAKAMI/Sprout + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ +#ifndef SPROUT_ALGORITHM_CXX14_MAKE_HEAP_HPP +#define SPROUT_ALGORITHM_CXX14_MAKE_HEAP_HPP + +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT + +namespace sprout { + namespace detail { + template + inline SPROUT_CXX14_CONSTEXPR void + make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp) { + typedef typename std::iterator_traits::difference_type difference_type; + difference_type len = last - first; + if (len > 1) { + last = first; + ++last; + for (difference_type i = 1; i < len; ++i) { + sprout::detail::push_heap_back(first, ++last, comp, i); + } + } + } + } // namespace detail + // + // 25.4.6.3 make_heap + // + template + inline SPROUT_CXX14_CONSTEXPR void + make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp) { + typedef typename std::add_lvalue_reference::type compare_ref; + sprout::detail::make_heap(first, last, comp); + } + + template + inline SPROUT_CXX14_CONSTEXPR void + make_heap(RandomAccessIterator first, RandomAccessIterator last) { + sprout::make_heap( + first, last, + NS_SSCRISK_CEL_OR_SPROUT::less::value_type>() + ); + } +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_CXX14_MAKE_HEAP_HPP diff --git a/sprout/algorithm/cxx14/next_permutation.hpp b/sprout/algorithm/cxx14/next_permutation.hpp new file mode 100644 index 00000000..2c9d9d8f --- /dev/null +++ b/sprout/algorithm/cxx14/next_permutation.hpp @@ -0,0 +1,64 @@ +/*============================================================================= + Copyright (c) 2011-2014 Bolero MURAKAMI + https://github.com/bolero-MURAKAMI/Sprout + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ +#ifndef SPROUT_ALGORITHM_CXX14_NEXT_PERMUTATION_HPP +#define SPROUT_ALGORITHM_CXX14_NEXT_PERMUTATION_HPP + +#include +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT + +namespace sprout { + namespace detail { + template + inline SPROUT_CXX14_CONSTEXPR bool + next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp) { + BidirectionalIterator i = last; + if (first == last || first == --i) { + return false; + } + while (true) { + BidirectionalIterator ip1 = i; + if (comp(*--i, *ip1)) { + BidirectionalIterator j = last; + while (!comp(*i, *--j)) + ; + sprout::swap(*i, *j); + sprout::reverse(ip1, last); + return true; + } + if (i == first) { + sprout::reverse(first, last); + return false; + } + } + } + } // namespace detail + // + // 25.4.9 Permutation generators + // + template + inline SPROUT_CXX14_CONSTEXPR bool + next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp) { + typedef typename std::add_lvalue_reference::type compare_ref; + return sprout::detail::next_permutation(first, last, comp); + } + + template + inline SPROUT_CXX14_CONSTEXPR bool + next_permutation(BidirectionalIterator first, BidirectionalIterator last) { + return sprout::next_permutation( + first, last, + NS_SSCRISK_CEL_OR_SPROUT::less::value_type>() + ); + } +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_CXX14_NEXT_PERMUTATION_HPP diff --git a/sprout/algorithm/cxx14/pop_heap.hpp b/sprout/algorithm/cxx14/pop_heap.hpp new file mode 100644 index 00000000..0332eb56 --- /dev/null +++ b/sprout/algorithm/cxx14/pop_heap.hpp @@ -0,0 +1,53 @@ +/*============================================================================= + Copyright (c) 2011-2014 Bolero MURAKAMI + https://github.com/bolero-MURAKAMI/Sprout + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ +#ifndef SPROUT_ALGORITHM_CXX14_POP_HEAP_HPP +#define SPROUT_ALGORITHM_CXX14_POP_HEAP_HPP + +#include +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT + +namespace sprout { + namespace detail { + template + inline SPROUT_CXX14_CONSTEXPR void + pop_heap( + RandomAccessIterator first, RandomAccessIterator last, Compare comp, + typename std::iterator_traits::difference_type len + ) + { + if (len > 1) { + sprout::swap(*first, *--last); + sprout::detail::push_heap_front(first, last, comp, len - 1); + } + } + } // namespace detail + // + // 25.4.6.2 pop_heap + // + template + inline SPROUT_CXX14_CONSTEXPR void + pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp) { + typedef typename std::add_lvalue_reference::type compare_ref; + sprout::detail::pop_heap(first, last, comp, last - first); + } + + template + inline SPROUT_CXX14_CONSTEXPR void + pop_heap(RandomAccessIterator first, RandomAccessIterator last) { + sprout::pop_heap( + first, last, + NS_SSCRISK_CEL_OR_SPROUT::less::value_type>() + ); + } +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_CXX14_POP_HEAP_HPP diff --git a/sprout/algorithm/cxx14/prev_permutation.hpp b/sprout/algorithm/cxx14/prev_permutation.hpp new file mode 100644 index 00000000..f4c462f5 --- /dev/null +++ b/sprout/algorithm/cxx14/prev_permutation.hpp @@ -0,0 +1,64 @@ +/*============================================================================= + Copyright (c) 2011-2014 Bolero MURAKAMI + https://github.com/bolero-MURAKAMI/Sprout + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ +#ifndef SPROUT_ALGORITHM_CXX14_PREV_PERMUTATION_HPP +#define SPROUT_ALGORITHM_CXX14_PREV_PERMUTATION_HPP + +#include +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT + +namespace sprout { + namespace detail { + template + inline SPROUT_CXX14_CONSTEXPR bool + prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp) { + BidirectionalIterator i = last; + if (first == last || first == --i) { + return false; + } + while (true) { + BidirectionalIterator ip1 = i; + if (comp(*ip1, *--i)) { + BidirectionalIterator j = last; + while (!comp(*--j, *i)) + ; + sprout::swap(*i, *j); + sprout::reverse(ip1, last); + return true; + } + if (i == first) { + sprout::reverse(first, last); + return false; + } + } + } + } // namespace detail + // + // 25.4.9 Permutation generators + // + template + inline SPROUT_CXX14_CONSTEXPR bool + prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp) { + typedef typename std::add_lvalue_reference::type compare_ref; + return sprout::detail::prev_permutation(first, last, comp); + } + + template + inline SPROUT_CXX14_CONSTEXPR bool + prev_permutation(BidirectionalIterator first, BidirectionalIterator last) { + return sprout::prev_permutation( + first, last, + NS_SSCRISK_CEL_OR_SPROUT::less::value_type>() + ); + } +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_CXX14_PREV_PERMUTATION_HPP diff --git a/sprout/algorithm/cxx14/push_heap.hpp b/sprout/algorithm/cxx14/push_heap.hpp new file mode 100644 index 00000000..b7561b13 --- /dev/null +++ b/sprout/algorithm/cxx14/push_heap.hpp @@ -0,0 +1,38 @@ +/*============================================================================= + Copyright (c) 2011-2014 Bolero MURAKAMI + https://github.com/bolero-MURAKAMI/Sprout + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ +#ifndef SPROUT_ALGORITHM_CXX14_PUSH_HEAP_HPP +#define SPROUT_ALGORITHM_CXX14_PUSH_HEAP_HPP + +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT + +namespace sprout { + // + // 25.4.6.1 push_heap + // + template + inline SPROUT_CXX14_CONSTEXPR void + push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp) { + typedef typename std::add_lvalue_reference::type compare_ref; + sprout::detail::push_heap_back(first, last, comp, last - first); + } + + template + inline SPROUT_CXX14_CONSTEXPR void + push_heap(RandomAccessIterator first, RandomAccessIterator last) { + sprout::push_heap( + first, last, + NS_SSCRISK_CEL_OR_SPROUT::less::value_type>() + ); + } +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_CXX14_PUSH_HEAP_HPP diff --git a/sprout/algorithm/cxx14/set_difference.hpp b/sprout/algorithm/cxx14/set_difference.hpp new file mode 100644 index 00000000..1a0fde67 --- /dev/null +++ b/sprout/algorithm/cxx14/set_difference.hpp @@ -0,0 +1,55 @@ +/*============================================================================= + Copyright (c) 2011-2014 Bolero MURAKAMI + https://github.com/bolero-MURAKAMI/Sprout + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ +#ifndef SPROUT_ALGORITHM_CXX14_SET_DIFFERENCE_HPP +#define SPROUT_ALGORITHM_CXX14_SET_DIFFERENCE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + // + // 25.4.5.4 set_difference + // + template< + typename InputIterator1, typename InputIterator2, typename OutputIterator, typename Compare, + typename sprout::enabler_if::value>::type = sprout::enabler + > + inline SPROUT_CXX14_CONSTEXPR OutputIterator + set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) { + while (first1 != last1 && first2 != last2) { + if (comp(*first1, *first2)) { + *result = *first1; + ++first1; + ++result; + } else if (comp(*first2, *first1)) { + ++first2; + } else { + ++first1; + ++first2; + } + } + return sprout::copy(first1, last1, result); + } + + template< + typename InputIterator1, typename InputIterator2, typename OutputIterator, + typename sprout::enabler_if::value>::type = sprout::enabler + > + inline SPROUT_CXX14_CONSTEXPR OutputIterator + set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { + return sprout::set_difference( + first1, last1, first2, last2, result, + sprout::less<>() + ); + } +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_CXX14_SET_DIFFERENCE_HPP diff --git a/sprout/algorithm/cxx14/set_intersection.hpp b/sprout/algorithm/cxx14/set_intersection.hpp new file mode 100644 index 00000000..28353d06 --- /dev/null +++ b/sprout/algorithm/cxx14/set_intersection.hpp @@ -0,0 +1,54 @@ +/*============================================================================= + Copyright (c) 2011-2014 Bolero MURAKAMI + https://github.com/bolero-MURAKAMI/Sprout + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ +#ifndef SPROUT_ALGORITHM_CXX14_SET_INTERSECTION_HPP +#define SPROUT_ALGORITHM_CXX14_SET_INTERSECTION_HPP + +#include +#include +#include +#include + +namespace sprout { + // + // 25.4.5.3 set_intersection + // + template< + typename InputIterator1, typename InputIterator2, typename OutputIterator, typename Compare, + typename sprout::enabler_if::value>::type = sprout::enabler + > + inline SPROUT_CXX14_CONSTEXPR OutputIterator + set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) { + while (first1 != last1 && first2 != last2) { + if (comp(*first1, *first2)) { + ++first1; + } else if (comp(*first2, *first1)) { + ++first2; + } else { + *result = *first1; + ++first1; + ++first2; + ++result; + } + } + return result; + } + + template< + typename InputIterator1, typename InputIterator2, typename OutputIterator, + typename sprout::enabler_if::value>::type = sprout::enabler + > + inline SPROUT_CXX14_CONSTEXPR OutputIterator + set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { + return sprout::set_intersection( + first1, last1, first2, last2, result, + sprout::less<>() + ); + } +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_CXX14_SET_INTERSECTION_HPP diff --git a/sprout/algorithm/cxx14/set_symmetric_difference.hpp b/sprout/algorithm/cxx14/set_symmetric_difference.hpp new file mode 100644 index 00000000..129a33e8 --- /dev/null +++ b/sprout/algorithm/cxx14/set_symmetric_difference.hpp @@ -0,0 +1,62 @@ +/*============================================================================= + Copyright (c) 2011-2014 Bolero MURAKAMI + https://github.com/bolero-MURAKAMI/Sprout + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ +#ifndef SPROUT_ALGORITHM_CXX14_SET_SYMMETRIC_DIFFERENCE_HPP +#define SPROUT_ALGORITHM_CXX14_SET_SYMMETRIC_DIFFERENCE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + // + // 25.4.5.5 set_symmetric_difference + // + template< + typename InputIterator1, typename InputIterator2, typename OutputIterator, typename Compare, + typename sprout::enabler_if::value>::type = sprout::enabler + > + inline SPROUT_CXX14_CONSTEXPR OutputIterator + set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) { + while (true) { + if (first1 == last1) { + return std::copy(first2, last2, result); + } + if (first2 == last2) { + return std::copy(first1, last1, result); + } + if (comp(*first1, *first2)) { + *result = *first1; + ++first1; + ++result; + } else if (comp(*first2, *first1)) { + *result = *first2; + ++first2; + ++result; + } else { + ++first1; + ++first2; + } + } + } + + template< + typename InputIterator1, typename InputIterator2, typename OutputIterator, + typename sprout::enabler_if::value>::type = sprout::enabler + > + inline SPROUT_CXX14_CONSTEXPR OutputIterator + set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { + return sprout::set_symmetric_difference( + first1, last1, first2, last2, result, + sprout::less<>() + ); + } +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_CXX14_SET_SYMMETRIC_DIFFERENCE_HPP diff --git a/sprout/algorithm/cxx14/set_union.hpp b/sprout/algorithm/cxx14/set_union.hpp new file mode 100644 index 00000000..c571abb7 --- /dev/null +++ b/sprout/algorithm/cxx14/set_union.hpp @@ -0,0 +1,62 @@ +/*============================================================================= + Copyright (c) 2011-2014 Bolero MURAKAMI + https://github.com/bolero-MURAKAMI/Sprout + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ +#ifndef SPROUT_ALGORITHM_CXX14_SET_UNION_HPP +#define SPROUT_ALGORITHM_CXX14_SET_UNION_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + // + // 25.4.5.2 set_union + // + template< + typename InputIterator1, typename InputIterator2, typename OutputIterator, typename Compare, + typename sprout::enabler_if::value>::type = sprout::enabler + > + inline SPROUT_CXX14_CONSTEXPR OutputIterator + set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) { + while (true) { + if (first1 == last1) { + return std::copy(first2, last2, result); + } + if (first2 == last2) { + return std::copy(first1, last1, result); + } + if (comp(*first1, *first2)) { + *result = *first1; + ++first1; + } else if (comp(*first2, *first1)) { + *result = *first2; + ++first2; + } else { + *result = *first1; + ++first1; + ++first2; + } + ++result; + } + } + + template< + typename InputIterator1, typename InputIterator2, typename OutputIterator, + typename sprout::enabler_if::value>::type = sprout::enabler + > + inline SPROUT_CXX14_CONSTEXPR OutputIterator + set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { + return sprout::set_union( + first1, last1, first2, last2, result, + sprout::less<>() + ); + } +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_CXX14_SET_UNION_HPP diff --git a/sprout/algorithm/cxx14/sort.hpp b/sprout/algorithm/cxx14/sort.hpp index 2d10f0af..8add0334 100644 --- a/sprout/algorithm/cxx14/sort.hpp +++ b/sprout/algorithm/cxx14/sort.hpp @@ -16,7 +16,6 @@ #include #include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT - namespace sprout { namespace detail { template diff --git a/sprout/algorithm/cxx14/sort_heap.hpp b/sprout/algorithm/cxx14/sort_heap.hpp new file mode 100644 index 00000000..03463822 --- /dev/null +++ b/sprout/algorithm/cxx14/sort_heap.hpp @@ -0,0 +1,49 @@ +/*============================================================================= + Copyright (c) 2011-2014 Bolero MURAKAMI + https://github.com/bolero-MURAKAMI/Sprout + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ +#ifndef SPROUT_ALGORITHM_CXX14_SORT_HEAP_HPP +#define SPROUT_ALGORITHM_CXX14_SORT_HEAP_HPP + +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT + +namespace sprout { + namespace detail { + template + inline SPROUT_CXX14_CONSTEXPR void + sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp) { + typedef typename std::iterator_traits::difference_type difference_type; + difference_type len = last - first; + for (difference_type len = last - first; len > 1; --last, --len) { + sprout::detail::pop_heap(first, last, comp, len); + } + } + } // namespace detail + // + // 25.4.6.4 sort_heap + // + template + inline SPROUT_CXX14_CONSTEXPR void + sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp) { + typedef typename std::add_lvalue_reference::type compare_ref; + sprout::detail::sort_heap(first, last, comp); + } + + template + inline SPROUT_CXX14_CONSTEXPR void + sort_heap(RandomAccessIterator first, RandomAccessIterator last) { + sprout::sort_heap( + first, last, + NS_SSCRISK_CEL_OR_SPROUT::less::value_type>() + ); + } +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_CXX14_SORT_HEAP_HPP