From b3bb8121e8da7b66010f269f3be828625800538a Mon Sep 17 00:00:00 2001 From: bolero-MURAKAMI Date: Thu, 1 Sep 2011 02:48:32 +0000 Subject: [PATCH] =?UTF-8?q?=E6=9C=80=E5=88=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sprout/adapt/sscrisk/cel/array.hpp | 24 + sprout/algorithm.hpp | 9 + sprout/algorithm/copy.hpp | 9 + sprout/algorithm/copy_backward.hpp | 9 + sprout/algorithm/copy_if.hpp | 9 + sprout/algorithm/copy_n.hpp | 9 + sprout/algorithm/fill.hpp | 9 + sprout/algorithm/fill_n.hpp | 9 + sprout/algorithm/fixed.hpp | 50 ++ sprout/algorithm/fixed/copy.hpp | 56 ++ sprout/algorithm/fixed/copy_backward.hpp | 56 ++ sprout/algorithm/fixed/copy_if.hpp | 129 +++ sprout/algorithm/fixed/copy_n.hpp | 34 + sprout/algorithm/fixed/fill.hpp | 50 ++ sprout/algorithm/fixed/fill_n.hpp | 33 + sprout/algorithm/fixed/generate.hpp | 193 ++++ sprout/algorithm/fixed/generate_n.hpp | 26 + sprout/algorithm/fixed/inplace_merge.hpp | 50 ++ sprout/algorithm/fixed/make_heap.hpp | 122 +++ sprout/algorithm/fixed/make_partial_heap.hpp | 102 +++ sprout/algorithm/fixed/merge.hpp | 176 ++++ sprout/algorithm/fixed/nth_element.hpp | 82 ++ sprout/algorithm/fixed/partial_sort.hpp | 70 ++ sprout/algorithm/fixed/partition.hpp | 25 + sprout/algorithm/fixed/partition_copy.hpp | 129 +++ sprout/algorithm/fixed/pop_heap.hpp | 86 ++ sprout/algorithm/fixed/push_heap.hpp | 66 ++ sprout/algorithm/fixed/remove.hpp | 25 + sprout/algorithm/fixed/remove_copy.hpp | 129 +++ sprout/algorithm/fixed/remove_copy_if.hpp | 129 +++ sprout/algorithm/fixed/remove_if.hpp | 25 + sprout/algorithm/fixed/replace.hpp | 26 + sprout/algorithm/fixed/replace_copy.hpp | 62 ++ sprout/algorithm/fixed/replace_copy_if.hpp | 62 ++ sprout/algorithm/fixed/replace_if.hpp | 26 + sprout/algorithm/fixed/reverse.hpp | 24 + sprout/algorithm/fixed/reverse_copy.hpp | 55 ++ sprout/algorithm/fixed/rotate.hpp | 25 + sprout/algorithm/fixed/rotate_copy.hpp | 62 ++ sprout/algorithm/fixed/set_difference.hpp | 178 ++++ sprout/algorithm/fixed/set_intersection.hpp | 178 ++++ .../fixed/set_symmetric_difference.hpp | 178 ++++ sprout/algorithm/fixed/set_union.hpp | 178 ++++ sprout/algorithm/fixed/sort.hpp | 191 ++++ sprout/algorithm/fixed/sort_heap.hpp | 72 ++ sprout/algorithm/fixed/stable_partition.hpp | 25 + .../algorithm/fixed/stable_partition_copy.hpp | 170 ++++ sprout/algorithm/fixed/stable_sort.hpp | 259 ++++++ sprout/algorithm/fixed/swap_element.hpp | 26 + sprout/algorithm/fixed/swap_element_copy.hpp | 66 ++ sprout/algorithm/fixed/transform.hpp | 106 +++ sprout/algorithm/fixed/unique.hpp | 36 + sprout/algorithm/fixed/unique_copy.hpp | 221 +++++ sprout/algorithm/generate.hpp | 9 + sprout/algorithm/generate_n.hpp | 9 + sprout/algorithm/infit.hpp | 50 ++ sprout/algorithm/infit/copy.hpp | 45 + sprout/algorithm/infit/copy_backward.hpp | 45 + sprout/algorithm/infit/copy_if.hpp | 46 + sprout/algorithm/infit/copy_n.hpp | 44 + sprout/algorithm/infit/fill.hpp | 41 + sprout/algorithm/infit/fill_n.hpp | 44 + sprout/algorithm/infit/generate.hpp | 43 + sprout/algorithm/infit/generate_n.hpp | 46 + sprout/algorithm/infit/inplace_merge.hpp | 70 ++ sprout/algorithm/infit/make_heap.hpp | 66 ++ sprout/algorithm/infit/make_partial_heap.hpp | 71 ++ sprout/algorithm/infit/merge.hpp | 90 ++ sprout/algorithm/infit/nth_element.hpp | 71 ++ sprout/algorithm/infit/partial_sort.hpp | 71 ++ sprout/algorithm/infit/partition.hpp | 42 + sprout/algorithm/infit/partition_copy.hpp | 46 + sprout/algorithm/infit/pop_heap.hpp | 66 ++ sprout/algorithm/infit/push_heap.hpp | 66 ++ sprout/algorithm/infit/remove.hpp | 42 + sprout/algorithm/infit/remove_copy.hpp | 47 + sprout/algorithm/infit/remove_copy_if.hpp | 47 + sprout/algorithm/infit/remove_if.hpp | 42 + sprout/algorithm/infit/replace.hpp | 43 + sprout/algorithm/infit/replace_copy.hpp | 49 + sprout/algorithm/infit/replace_copy_if.hpp | 49 + sprout/algorithm/infit/replace_if.hpp | 43 + sprout/algorithm/infit/reverse.hpp | 39 + sprout/algorithm/infit/reverse_copy.hpp | 45 + sprout/algorithm/infit/rotate.hpp | 41 + sprout/algorithm/infit/rotate_copy.hpp | 47 + sprout/algorithm/infit/set_difference.hpp | 95 ++ sprout/algorithm/infit/set_intersection.hpp | 90 ++ .../infit/set_symmetric_difference.hpp | 97 ++ sprout/algorithm/infit/set_union.hpp | 97 ++ sprout/algorithm/infit/sort.hpp | 66 ++ sprout/algorithm/infit/sort_heap.hpp | 66 ++ sprout/algorithm/infit/stable_partition.hpp | 42 + .../algorithm/infit/stable_partition_copy.hpp | 46 + sprout/algorithm/infit/stable_sort.hpp | 66 ++ sprout/algorithm/infit/swap_element.hpp | 43 + sprout/algorithm/infit/swap_element_copy.hpp | 49 + sprout/algorithm/infit/transform.hpp | 80 ++ sprout/algorithm/infit/unique.hpp | 67 ++ sprout/algorithm/infit/unique_copy.hpp | 77 ++ sprout/algorithm/inplace_merge.hpp | 9 + sprout/algorithm/make_heap.hpp | 9 + sprout/algorithm/make_partial_heap.hpp | 9 + sprout/algorithm/merge.hpp | 9 + sprout/algorithm/nth_element.hpp | 9 + sprout/algorithm/outfit.hpp | 50 ++ sprout/algorithm/outfit/copy.hpp | 43 + sprout/algorithm/outfit/copy_backward.hpp | 43 + sprout/algorithm/outfit/copy_if.hpp | 45 + sprout/algorithm/outfit/copy_n.hpp | 43 + sprout/algorithm/outfit/fill.hpp | 41 + sprout/algorithm/outfit/fill_n.hpp | 43 + sprout/algorithm/outfit/generate.hpp | 43 + sprout/algorithm/outfit/generate_n.hpp | 45 + sprout/algorithm/outfit/inplace_merge.hpp | 70 ++ sprout/algorithm/outfit/make_heap.hpp | 66 ++ sprout/algorithm/outfit/make_partial_heap.hpp | 70 ++ sprout/algorithm/outfit/merge.hpp | 82 ++ sprout/algorithm/outfit/nth_element.hpp | 70 ++ sprout/algorithm/outfit/partial_sort.hpp | 70 ++ sprout/algorithm/outfit/partition.hpp | 41 + sprout/algorithm/outfit/partition_copy.hpp | 45 + sprout/algorithm/outfit/pop_heap.hpp | 66 ++ sprout/algorithm/outfit/push_heap.hpp | 66 ++ sprout/algorithm/outfit/remove.hpp | 41 + sprout/algorithm/outfit/remove_copy.hpp | 45 + sprout/algorithm/outfit/remove_copy_if.hpp | 45 + sprout/algorithm/outfit/remove_if.hpp | 41 + sprout/algorithm/outfit/replace.hpp | 43 + sprout/algorithm/outfit/replace_copy.hpp | 47 + sprout/algorithm/outfit/replace_copy_if.hpp | 47 + sprout/algorithm/outfit/replace_if.hpp | 43 + sprout/algorithm/outfit/reverse.hpp | 39 + sprout/algorithm/outfit/reverse_copy.hpp | 43 + sprout/algorithm/outfit/rotate.hpp | 41 + sprout/algorithm/outfit/rotate_copy.hpp | 45 + sprout/algorithm/outfit/set_difference.hpp | 82 ++ sprout/algorithm/outfit/set_intersection.hpp | 82 ++ .../outfit/set_symmetric_difference.hpp | 82 ++ sprout/algorithm/outfit/set_union.hpp | 82 ++ sprout/algorithm/outfit/sort.hpp | 66 ++ sprout/algorithm/outfit/sort_heap.hpp | 66 ++ sprout/algorithm/outfit/stable_partition.hpp | 41 + .../outfit/stable_partition_copy.hpp | 45 + sprout/algorithm/outfit/stable_sort.hpp | 66 ++ sprout/algorithm/outfit/swap_element.hpp | 43 + sprout/algorithm/outfit/swap_element_copy.hpp | 47 + sprout/algorithm/outfit/transform.hpp | 78 ++ sprout/algorithm/outfit/unique.hpp | 66 ++ sprout/algorithm/outfit/unique_copy.hpp | 74 ++ sprout/algorithm/partial_sort.hpp | 9 + sprout/algorithm/partition.hpp | 9 + sprout/algorithm/partition_copy.hpp | 9 + sprout/algorithm/pop_heap.hpp | 9 + sprout/algorithm/push_heap.hpp | 9 + sprout/algorithm/remove.hpp | 9 + sprout/algorithm/remove_copy.hpp | 9 + sprout/algorithm/remove_copy_if.hpp | 9 + sprout/algorithm/remove_if.hpp | 9 + sprout/algorithm/replace.hpp | 9 + sprout/algorithm/replace_copy.hpp | 9 + sprout/algorithm/replace_copy_if.hpp | 9 + sprout/algorithm/replace_if.hpp | 9 + sprout/algorithm/reverse.hpp | 9 + sprout/algorithm/reverse_copy.hpp | 9 + sprout/algorithm/rotate.hpp | 9 + sprout/algorithm/rotate_copy.hpp | 9 + sprout/algorithm/set_difference.hpp | 9 + sprout/algorithm/set_intersection.hpp | 9 + sprout/algorithm/set_symmetric_difference.hpp | 9 + sprout/algorithm/set_union.hpp | 9 + sprout/algorithm/sort.hpp | 9 + sprout/algorithm/sort_heap.hpp | 9 + sprout/algorithm/stable_partition.hpp | 9 + sprout/algorithm/stable_partition_copy.hpp | 9 + sprout/algorithm/stable_sort.hpp | 9 + sprout/algorithm/swap_element.hpp | 9 + sprout/algorithm/swap_element_copy.hpp | 9 + sprout/algorithm/transform.hpp | 9 + sprout/algorithm/unique.hpp | 9 + sprout/algorithm/unique_copy.hpp | 9 + sprout/array.hpp | 261 ++++++ sprout/config.hpp | 30 + sprout/detail/algorithm.hpp | 131 +++ sprout/detail/functional.hpp | 24 + sprout/detail/if.hpp | 30 + sprout/detail/iterator.hpp | 182 ++++ sprout/detail/overlap_count.hpp | 72 ++ sprout/detail/overlap_count_2.hpp | 53 ++ sprout/detail/param_at.hpp | 37 + sprout/fixed_container.hpp | 9 + sprout/fixed_container/begin.hpp | 45 + sprout/fixed_container/const_iterator.hpp | 18 + sprout/fixed_container/const_pointer.hpp | 18 + sprout/fixed_container/const_reference.hpp | 18 + sprout/fixed_container/difference_type.hpp | 18 + sprout/fixed_container/empty.hpp | 18 + sprout/fixed_container/end.hpp | 45 + sprout/fixed_container/fixed_begin.hpp | 37 + sprout/fixed_container/fixed_begin_offset.hpp | 20 + .../fixed_container/fixed_container_type.hpp | 18 + sprout/fixed_container/fixed_end.hpp | 37 + sprout/fixed_container/fixed_end_offset.hpp | 20 + sprout/fixed_container/fixed_size.hpp | 22 + sprout/fixed_container/functions.hpp | 15 + sprout/fixed_container/get_fixed.hpp | 37 + sprout/fixed_container/iterator.hpp | 24 + sprout/fixed_container/metafunctions.hpp | 21 + sprout/fixed_container/mutable_iterator.hpp | 18 + sprout/fixed_container/mutable_pointer.hpp | 18 + sprout/fixed_container/mutable_reference.hpp | 18 + sprout/fixed_container/pointer.hpp | 24 + .../rebind_fixed_size_eval.hpp | 17 + sprout/fixed_container/reference.hpp | 24 + sprout/fixed_container/size.hpp | 20 + sprout/fixed_container/size_type.hpp | 18 + sprout/fixed_container/traits.hpp | 97 ++ sprout/fixed_container/value_type.hpp | 18 + sprout/index_tuple.hpp | 59 ++ sprout/operation.hpp | 8 + sprout/operation/erase.hpp | 8 + sprout/operation/erase_n.hpp | 8 + sprout/operation/fit.hpp | 25 + sprout/operation/fit/erase.hpp | 57 ++ sprout/operation/fit/erase_n.hpp | 57 ++ sprout/operation/fit/insert.hpp | 61 ++ sprout/operation/fit/insert_n.hpp | 61 ++ sprout/operation/fit/join.hpp | 58 ++ sprout/operation/fit/join_back.hpp | 40 + sprout/operation/fit/join_front.hpp | 40 + sprout/operation/fit/pop_back.hpp | 41 + sprout/operation/fit/pop_back_n.hpp | 41 + sprout/operation/fit/pop_front.hpp | 41 + sprout/operation/fit/pop_front_n.hpp | 41 + sprout/operation/fit/push_back.hpp | 42 + sprout/operation/fit/push_back_n.hpp | 42 + sprout/operation/fit/push_front.hpp | 42 + sprout/operation/fit/push_front_n.hpp | 42 + sprout/operation/fit/realign.hpp | 56 ++ sprout/operation/fit/realign_to.hpp | 56 ++ sprout/operation/fit/resize.hpp | 57 ++ sprout/operation/fit/resize_backward.hpp | 57 ++ sprout/operation/fixed.hpp | 25 + sprout/operation/fixed/erase.hpp | 81 ++ sprout/operation/fixed/erase_n.hpp | 81 ++ sprout/operation/fixed/insert.hpp | 94 ++ sprout/operation/fixed/insert_n.hpp | 95 ++ sprout/operation/fixed/join.hpp | 90 ++ sprout/operation/fixed/join_back.hpp | 43 + sprout/operation/fixed/join_front.hpp | 43 + sprout/operation/fixed/pop_back.hpp | 40 + sprout/operation/fixed/pop_back_n.hpp | 40 + sprout/operation/fixed/pop_front.hpp | 40 + sprout/operation/fixed/pop_front_n.hpp | 40 + sprout/operation/fixed/push_back.hpp | 44 + sprout/operation/fixed/push_back_n.hpp | 44 + sprout/operation/fixed/push_front.hpp | 44 + sprout/operation/fixed/push_front_n.hpp | 44 + sprout/operation/fixed/realign.hpp | 90 ++ sprout/operation/fixed/realign_to.hpp | 62 ++ sprout/operation/fixed/resize.hpp | 93 ++ sprout/operation/fixed/resize_backward.hpp | 99 +++ sprout/operation/insert.hpp | 8 + sprout/operation/insert_n.hpp | 8 + sprout/operation/join.hpp | 8 + sprout/operation/join_back.hpp | 8 + sprout/operation/join_front.hpp | 8 + sprout/operation/pop_back.hpp | 8 + sprout/operation/pop_back_n.hpp | 8 + sprout/operation/pop_front.hpp | 8 + sprout/operation/pop_front_n.hpp | 8 + sprout/operation/push_back.hpp | 8 + sprout/operation/push_back_n.hpp | 8 + sprout/operation/push_front.hpp | 8 + sprout/operation/push_front_n.hpp | 8 + sprout/operation/realign.hpp | 8 + sprout/operation/realign_to.hpp | 8 + sprout/operation/resize.hpp | 8 + sprout/operation/resize_backward.hpp | 8 + sprout/range/algorithm.hpp | 9 + sprout/range/algorithm/copy.hpp | 9 + sprout/range/algorithm/copy_backward.hpp | 9 + sprout/range/algorithm/copy_if.hpp | 9 + sprout/range/algorithm/fixed.hpp | 25 + sprout/range/algorithm/fixed/copy.hpp | 27 + .../range/algorithm/fixed/copy_backward.hpp | 27 + sprout/range/algorithm/fixed/copy_if.hpp | 27 + sprout/range/algorithm/fixed/merge.hpp | 42 + .../range/algorithm/fixed/partition_copy.hpp | 28 + sprout/range/algorithm/fixed/remove_copy.hpp | 28 + .../range/algorithm/fixed/remove_copy_if.hpp | 28 + sprout/range/algorithm/fixed/replace_copy.hpp | 29 + .../range/algorithm/fixed/replace_copy_if.hpp | 29 + sprout/range/algorithm/fixed/reverse_copy.hpp | 27 + sprout/range/algorithm/fixed/rotate_copy.hpp | 28 + .../range/algorithm/fixed/set_difference.hpp | 42 + .../algorithm/fixed/set_intersection.hpp | 42 + .../fixed/set_symmetric_difference.hpp | 42 + sprout/range/algorithm/fixed/set_union.hpp | 42 + .../algorithm/fixed/stable_partition_copy.hpp | 28 + .../algorithm/fixed/swap_element_copy.hpp | 29 + sprout/range/algorithm/fixed/transform.hpp | 43 + sprout/range/algorithm/fixed/unique_copy.hpp | 40 + sprout/range/algorithm/infit.hpp | 25 + sprout/range/algorithm/infit/copy.hpp | 28 + .../range/algorithm/infit/copy_backward.hpp | 28 + sprout/range/algorithm/infit/copy_if.hpp | 28 + sprout/range/algorithm/infit/merge.hpp | 42 + .../range/algorithm/infit/partition_copy.hpp | 29 + sprout/range/algorithm/infit/remove_copy.hpp | 29 + .../range/algorithm/infit/remove_copy_if.hpp | 29 + sprout/range/algorithm/infit/replace_copy.hpp | 30 + .../range/algorithm/infit/replace_copy_if.hpp | 30 + sprout/range/algorithm/infit/reverse_copy.hpp | 28 + sprout/range/algorithm/infit/rotate_copy.hpp | 29 + .../range/algorithm/infit/set_difference.hpp | 42 + .../algorithm/infit/set_intersection.hpp | 42 + .../infit/set_symmetric_difference.hpp | 42 + sprout/range/algorithm/infit/set_union.hpp | 42 + .../algorithm/infit/stable_partition_copy.hpp | 29 + .../algorithm/infit/swap_element_copy.hpp | 30 + sprout/range/algorithm/infit/transform.hpp | 43 + sprout/range/algorithm/infit/unique_copy.hpp | 41 + sprout/range/algorithm/merge.hpp | 9 + sprout/range/algorithm/outfit.hpp | 25 + sprout/range/algorithm/outfit/copy.hpp | 28 + .../range/algorithm/outfit/copy_backward.hpp | 28 + sprout/range/algorithm/outfit/copy_if.hpp | 29 + sprout/range/algorithm/outfit/merge.hpp | 42 + .../range/algorithm/outfit/partition_copy.hpp | 29 + sprout/range/algorithm/outfit/remove_copy.hpp | 29 + .../range/algorithm/outfit/remove_copy_if.hpp | 29 + .../range/algorithm/outfit/replace_copy.hpp | 30 + .../algorithm/outfit/replace_copy_if.hpp | 30 + .../range/algorithm/outfit/reverse_copy.hpp | 28 + sprout/range/algorithm/outfit/rotate_copy.hpp | 29 + .../range/algorithm/outfit/set_difference.hpp | 42 + .../algorithm/outfit/set_intersection.hpp | 42 + .../outfit/set_symmetric_difference.hpp | 42 + sprout/range/algorithm/outfit/set_union.hpp | 42 + .../outfit/stable_partition_copy.hpp | 29 + .../algorithm/outfit/swap_element_copy.hpp | 30 + sprout/range/algorithm/outfit/transform.hpp | 43 + sprout/range/algorithm/outfit/unique_copy.hpp | 41 + sprout/range/algorithm/partition_copy.hpp | 9 + sprout/range/algorithm/remove_copy.hpp | 9 + sprout/range/algorithm/remove_copy_if.hpp | 9 + sprout/range/algorithm/replace_copy.hpp | 9 + sprout/range/algorithm/replace_copy_if.hpp | 9 + sprout/range/algorithm/reverse_copy.hpp | 9 + sprout/range/algorithm/rotate_copy.hpp | 9 + sprout/range/algorithm/set_difference.hpp | 9 + sprout/range/algorithm/set_intersection.hpp | 9 + .../algorithm/set_symmetric_difference.hpp | 9 + sprout/range/algorithm/set_union.hpp | 9 + .../range/algorithm/stable_partition_copy.hpp | 9 + sprout/range/algorithm/swap_element_copy.hpp | 9 + sprout/range/algorithm/transform.hpp | 9 + sprout/range/algorithm/unique_copy.hpp | 9 + sprout/string.hpp | 317 +++++++ sprout/sub_array.hpp | 835 ++++++++++++++++++ user_config.hpp | 4 + 362 files changed, 16820 insertions(+) create mode 100644 sprout/adapt/sscrisk/cel/array.hpp create mode 100644 sprout/algorithm.hpp create mode 100644 sprout/algorithm/copy.hpp create mode 100644 sprout/algorithm/copy_backward.hpp create mode 100644 sprout/algorithm/copy_if.hpp create mode 100644 sprout/algorithm/copy_n.hpp create mode 100644 sprout/algorithm/fill.hpp create mode 100644 sprout/algorithm/fill_n.hpp create mode 100644 sprout/algorithm/fixed.hpp create mode 100644 sprout/algorithm/fixed/copy.hpp create mode 100644 sprout/algorithm/fixed/copy_backward.hpp create mode 100644 sprout/algorithm/fixed/copy_if.hpp create mode 100644 sprout/algorithm/fixed/copy_n.hpp create mode 100644 sprout/algorithm/fixed/fill.hpp create mode 100644 sprout/algorithm/fixed/fill_n.hpp create mode 100644 sprout/algorithm/fixed/generate.hpp create mode 100644 sprout/algorithm/fixed/generate_n.hpp create mode 100644 sprout/algorithm/fixed/inplace_merge.hpp create mode 100644 sprout/algorithm/fixed/make_heap.hpp create mode 100644 sprout/algorithm/fixed/make_partial_heap.hpp create mode 100644 sprout/algorithm/fixed/merge.hpp create mode 100644 sprout/algorithm/fixed/nth_element.hpp create mode 100644 sprout/algorithm/fixed/partial_sort.hpp create mode 100644 sprout/algorithm/fixed/partition.hpp create mode 100644 sprout/algorithm/fixed/partition_copy.hpp create mode 100644 sprout/algorithm/fixed/pop_heap.hpp create mode 100644 sprout/algorithm/fixed/push_heap.hpp create mode 100644 sprout/algorithm/fixed/remove.hpp create mode 100644 sprout/algorithm/fixed/remove_copy.hpp create mode 100644 sprout/algorithm/fixed/remove_copy_if.hpp create mode 100644 sprout/algorithm/fixed/remove_if.hpp create mode 100644 sprout/algorithm/fixed/replace.hpp create mode 100644 sprout/algorithm/fixed/replace_copy.hpp create mode 100644 sprout/algorithm/fixed/replace_copy_if.hpp create mode 100644 sprout/algorithm/fixed/replace_if.hpp create mode 100644 sprout/algorithm/fixed/reverse.hpp create mode 100644 sprout/algorithm/fixed/reverse_copy.hpp create mode 100644 sprout/algorithm/fixed/rotate.hpp create mode 100644 sprout/algorithm/fixed/rotate_copy.hpp create mode 100644 sprout/algorithm/fixed/set_difference.hpp create mode 100644 sprout/algorithm/fixed/set_intersection.hpp create mode 100644 sprout/algorithm/fixed/set_symmetric_difference.hpp create mode 100644 sprout/algorithm/fixed/set_union.hpp create mode 100644 sprout/algorithm/fixed/sort.hpp create mode 100644 sprout/algorithm/fixed/sort_heap.hpp create mode 100644 sprout/algorithm/fixed/stable_partition.hpp create mode 100644 sprout/algorithm/fixed/stable_partition_copy.hpp create mode 100644 sprout/algorithm/fixed/stable_sort.hpp create mode 100644 sprout/algorithm/fixed/swap_element.hpp create mode 100644 sprout/algorithm/fixed/swap_element_copy.hpp create mode 100644 sprout/algorithm/fixed/transform.hpp create mode 100644 sprout/algorithm/fixed/unique.hpp create mode 100644 sprout/algorithm/fixed/unique_copy.hpp create mode 100644 sprout/algorithm/generate.hpp create mode 100644 sprout/algorithm/generate_n.hpp create mode 100644 sprout/algorithm/infit.hpp create mode 100644 sprout/algorithm/infit/copy.hpp create mode 100644 sprout/algorithm/infit/copy_backward.hpp create mode 100644 sprout/algorithm/infit/copy_if.hpp create mode 100644 sprout/algorithm/infit/copy_n.hpp create mode 100644 sprout/algorithm/infit/fill.hpp create mode 100644 sprout/algorithm/infit/fill_n.hpp create mode 100644 sprout/algorithm/infit/generate.hpp create mode 100644 sprout/algorithm/infit/generate_n.hpp create mode 100644 sprout/algorithm/infit/inplace_merge.hpp create mode 100644 sprout/algorithm/infit/make_heap.hpp create mode 100644 sprout/algorithm/infit/make_partial_heap.hpp create mode 100644 sprout/algorithm/infit/merge.hpp create mode 100644 sprout/algorithm/infit/nth_element.hpp create mode 100644 sprout/algorithm/infit/partial_sort.hpp create mode 100644 sprout/algorithm/infit/partition.hpp create mode 100644 sprout/algorithm/infit/partition_copy.hpp create mode 100644 sprout/algorithm/infit/pop_heap.hpp create mode 100644 sprout/algorithm/infit/push_heap.hpp create mode 100644 sprout/algorithm/infit/remove.hpp create mode 100644 sprout/algorithm/infit/remove_copy.hpp create mode 100644 sprout/algorithm/infit/remove_copy_if.hpp create mode 100644 sprout/algorithm/infit/remove_if.hpp create mode 100644 sprout/algorithm/infit/replace.hpp create mode 100644 sprout/algorithm/infit/replace_copy.hpp create mode 100644 sprout/algorithm/infit/replace_copy_if.hpp create mode 100644 sprout/algorithm/infit/replace_if.hpp create mode 100644 sprout/algorithm/infit/reverse.hpp create mode 100644 sprout/algorithm/infit/reverse_copy.hpp create mode 100644 sprout/algorithm/infit/rotate.hpp create mode 100644 sprout/algorithm/infit/rotate_copy.hpp create mode 100644 sprout/algorithm/infit/set_difference.hpp create mode 100644 sprout/algorithm/infit/set_intersection.hpp create mode 100644 sprout/algorithm/infit/set_symmetric_difference.hpp create mode 100644 sprout/algorithm/infit/set_union.hpp create mode 100644 sprout/algorithm/infit/sort.hpp create mode 100644 sprout/algorithm/infit/sort_heap.hpp create mode 100644 sprout/algorithm/infit/stable_partition.hpp create mode 100644 sprout/algorithm/infit/stable_partition_copy.hpp create mode 100644 sprout/algorithm/infit/stable_sort.hpp create mode 100644 sprout/algorithm/infit/swap_element.hpp create mode 100644 sprout/algorithm/infit/swap_element_copy.hpp create mode 100644 sprout/algorithm/infit/transform.hpp create mode 100644 sprout/algorithm/infit/unique.hpp create mode 100644 sprout/algorithm/infit/unique_copy.hpp create mode 100644 sprout/algorithm/inplace_merge.hpp create mode 100644 sprout/algorithm/make_heap.hpp create mode 100644 sprout/algorithm/make_partial_heap.hpp create mode 100644 sprout/algorithm/merge.hpp create mode 100644 sprout/algorithm/nth_element.hpp create mode 100644 sprout/algorithm/outfit.hpp create mode 100644 sprout/algorithm/outfit/copy.hpp create mode 100644 sprout/algorithm/outfit/copy_backward.hpp create mode 100644 sprout/algorithm/outfit/copy_if.hpp create mode 100644 sprout/algorithm/outfit/copy_n.hpp create mode 100644 sprout/algorithm/outfit/fill.hpp create mode 100644 sprout/algorithm/outfit/fill_n.hpp create mode 100644 sprout/algorithm/outfit/generate.hpp create mode 100644 sprout/algorithm/outfit/generate_n.hpp create mode 100644 sprout/algorithm/outfit/inplace_merge.hpp create mode 100644 sprout/algorithm/outfit/make_heap.hpp create mode 100644 sprout/algorithm/outfit/make_partial_heap.hpp create mode 100644 sprout/algorithm/outfit/merge.hpp create mode 100644 sprout/algorithm/outfit/nth_element.hpp create mode 100644 sprout/algorithm/outfit/partial_sort.hpp create mode 100644 sprout/algorithm/outfit/partition.hpp create mode 100644 sprout/algorithm/outfit/partition_copy.hpp create mode 100644 sprout/algorithm/outfit/pop_heap.hpp create mode 100644 sprout/algorithm/outfit/push_heap.hpp create mode 100644 sprout/algorithm/outfit/remove.hpp create mode 100644 sprout/algorithm/outfit/remove_copy.hpp create mode 100644 sprout/algorithm/outfit/remove_copy_if.hpp create mode 100644 sprout/algorithm/outfit/remove_if.hpp create mode 100644 sprout/algorithm/outfit/replace.hpp create mode 100644 sprout/algorithm/outfit/replace_copy.hpp create mode 100644 sprout/algorithm/outfit/replace_copy_if.hpp create mode 100644 sprout/algorithm/outfit/replace_if.hpp create mode 100644 sprout/algorithm/outfit/reverse.hpp create mode 100644 sprout/algorithm/outfit/reverse_copy.hpp create mode 100644 sprout/algorithm/outfit/rotate.hpp create mode 100644 sprout/algorithm/outfit/rotate_copy.hpp create mode 100644 sprout/algorithm/outfit/set_difference.hpp create mode 100644 sprout/algorithm/outfit/set_intersection.hpp create mode 100644 sprout/algorithm/outfit/set_symmetric_difference.hpp create mode 100644 sprout/algorithm/outfit/set_union.hpp create mode 100644 sprout/algorithm/outfit/sort.hpp create mode 100644 sprout/algorithm/outfit/sort_heap.hpp create mode 100644 sprout/algorithm/outfit/stable_partition.hpp create mode 100644 sprout/algorithm/outfit/stable_partition_copy.hpp create mode 100644 sprout/algorithm/outfit/stable_sort.hpp create mode 100644 sprout/algorithm/outfit/swap_element.hpp create mode 100644 sprout/algorithm/outfit/swap_element_copy.hpp create mode 100644 sprout/algorithm/outfit/transform.hpp create mode 100644 sprout/algorithm/outfit/unique.hpp create mode 100644 sprout/algorithm/outfit/unique_copy.hpp create mode 100644 sprout/algorithm/partial_sort.hpp create mode 100644 sprout/algorithm/partition.hpp create mode 100644 sprout/algorithm/partition_copy.hpp create mode 100644 sprout/algorithm/pop_heap.hpp create mode 100644 sprout/algorithm/push_heap.hpp create mode 100644 sprout/algorithm/remove.hpp create mode 100644 sprout/algorithm/remove_copy.hpp create mode 100644 sprout/algorithm/remove_copy_if.hpp create mode 100644 sprout/algorithm/remove_if.hpp create mode 100644 sprout/algorithm/replace.hpp create mode 100644 sprout/algorithm/replace_copy.hpp create mode 100644 sprout/algorithm/replace_copy_if.hpp create mode 100644 sprout/algorithm/replace_if.hpp create mode 100644 sprout/algorithm/reverse.hpp create mode 100644 sprout/algorithm/reverse_copy.hpp create mode 100644 sprout/algorithm/rotate.hpp create mode 100644 sprout/algorithm/rotate_copy.hpp create mode 100644 sprout/algorithm/set_difference.hpp create mode 100644 sprout/algorithm/set_intersection.hpp create mode 100644 sprout/algorithm/set_symmetric_difference.hpp create mode 100644 sprout/algorithm/set_union.hpp create mode 100644 sprout/algorithm/sort.hpp create mode 100644 sprout/algorithm/sort_heap.hpp create mode 100644 sprout/algorithm/stable_partition.hpp create mode 100644 sprout/algorithm/stable_partition_copy.hpp create mode 100644 sprout/algorithm/stable_sort.hpp create mode 100644 sprout/algorithm/swap_element.hpp create mode 100644 sprout/algorithm/swap_element_copy.hpp create mode 100644 sprout/algorithm/transform.hpp create mode 100644 sprout/algorithm/unique.hpp create mode 100644 sprout/algorithm/unique_copy.hpp create mode 100644 sprout/array.hpp create mode 100644 sprout/config.hpp create mode 100644 sprout/detail/algorithm.hpp create mode 100644 sprout/detail/functional.hpp create mode 100644 sprout/detail/if.hpp create mode 100644 sprout/detail/iterator.hpp create mode 100644 sprout/detail/overlap_count.hpp create mode 100644 sprout/detail/overlap_count_2.hpp create mode 100644 sprout/detail/param_at.hpp create mode 100644 sprout/fixed_container.hpp create mode 100644 sprout/fixed_container/begin.hpp create mode 100644 sprout/fixed_container/const_iterator.hpp create mode 100644 sprout/fixed_container/const_pointer.hpp create mode 100644 sprout/fixed_container/const_reference.hpp create mode 100644 sprout/fixed_container/difference_type.hpp create mode 100644 sprout/fixed_container/empty.hpp create mode 100644 sprout/fixed_container/end.hpp create mode 100644 sprout/fixed_container/fixed_begin.hpp create mode 100644 sprout/fixed_container/fixed_begin_offset.hpp create mode 100644 sprout/fixed_container/fixed_container_type.hpp create mode 100644 sprout/fixed_container/fixed_end.hpp create mode 100644 sprout/fixed_container/fixed_end_offset.hpp create mode 100644 sprout/fixed_container/fixed_size.hpp create mode 100644 sprout/fixed_container/functions.hpp create mode 100644 sprout/fixed_container/get_fixed.hpp create mode 100644 sprout/fixed_container/iterator.hpp create mode 100644 sprout/fixed_container/metafunctions.hpp create mode 100644 sprout/fixed_container/mutable_iterator.hpp create mode 100644 sprout/fixed_container/mutable_pointer.hpp create mode 100644 sprout/fixed_container/mutable_reference.hpp create mode 100644 sprout/fixed_container/pointer.hpp create mode 100644 sprout/fixed_container/rebind_fixed_size_eval.hpp create mode 100644 sprout/fixed_container/reference.hpp create mode 100644 sprout/fixed_container/size.hpp create mode 100644 sprout/fixed_container/size_type.hpp create mode 100644 sprout/fixed_container/traits.hpp create mode 100644 sprout/fixed_container/value_type.hpp create mode 100644 sprout/index_tuple.hpp create mode 100644 sprout/operation.hpp create mode 100644 sprout/operation/erase.hpp create mode 100644 sprout/operation/erase_n.hpp create mode 100644 sprout/operation/fit.hpp create mode 100644 sprout/operation/fit/erase.hpp create mode 100644 sprout/operation/fit/erase_n.hpp create mode 100644 sprout/operation/fit/insert.hpp create mode 100644 sprout/operation/fit/insert_n.hpp create mode 100644 sprout/operation/fit/join.hpp create mode 100644 sprout/operation/fit/join_back.hpp create mode 100644 sprout/operation/fit/join_front.hpp create mode 100644 sprout/operation/fit/pop_back.hpp create mode 100644 sprout/operation/fit/pop_back_n.hpp create mode 100644 sprout/operation/fit/pop_front.hpp create mode 100644 sprout/operation/fit/pop_front_n.hpp create mode 100644 sprout/operation/fit/push_back.hpp create mode 100644 sprout/operation/fit/push_back_n.hpp create mode 100644 sprout/operation/fit/push_front.hpp create mode 100644 sprout/operation/fit/push_front_n.hpp create mode 100644 sprout/operation/fit/realign.hpp create mode 100644 sprout/operation/fit/realign_to.hpp create mode 100644 sprout/operation/fit/resize.hpp create mode 100644 sprout/operation/fit/resize_backward.hpp create mode 100644 sprout/operation/fixed.hpp create mode 100644 sprout/operation/fixed/erase.hpp create mode 100644 sprout/operation/fixed/erase_n.hpp create mode 100644 sprout/operation/fixed/insert.hpp create mode 100644 sprout/operation/fixed/insert_n.hpp create mode 100644 sprout/operation/fixed/join.hpp create mode 100644 sprout/operation/fixed/join_back.hpp create mode 100644 sprout/operation/fixed/join_front.hpp create mode 100644 sprout/operation/fixed/pop_back.hpp create mode 100644 sprout/operation/fixed/pop_back_n.hpp create mode 100644 sprout/operation/fixed/pop_front.hpp create mode 100644 sprout/operation/fixed/pop_front_n.hpp create mode 100644 sprout/operation/fixed/push_back.hpp create mode 100644 sprout/operation/fixed/push_back_n.hpp create mode 100644 sprout/operation/fixed/push_front.hpp create mode 100644 sprout/operation/fixed/push_front_n.hpp create mode 100644 sprout/operation/fixed/realign.hpp create mode 100644 sprout/operation/fixed/realign_to.hpp create mode 100644 sprout/operation/fixed/resize.hpp create mode 100644 sprout/operation/fixed/resize_backward.hpp create mode 100644 sprout/operation/insert.hpp create mode 100644 sprout/operation/insert_n.hpp create mode 100644 sprout/operation/join.hpp create mode 100644 sprout/operation/join_back.hpp create mode 100644 sprout/operation/join_front.hpp create mode 100644 sprout/operation/pop_back.hpp create mode 100644 sprout/operation/pop_back_n.hpp create mode 100644 sprout/operation/pop_front.hpp create mode 100644 sprout/operation/pop_front_n.hpp create mode 100644 sprout/operation/push_back.hpp create mode 100644 sprout/operation/push_back_n.hpp create mode 100644 sprout/operation/push_front.hpp create mode 100644 sprout/operation/push_front_n.hpp create mode 100644 sprout/operation/realign.hpp create mode 100644 sprout/operation/realign_to.hpp create mode 100644 sprout/operation/resize.hpp create mode 100644 sprout/operation/resize_backward.hpp create mode 100644 sprout/range/algorithm.hpp create mode 100644 sprout/range/algorithm/copy.hpp create mode 100644 sprout/range/algorithm/copy_backward.hpp create mode 100644 sprout/range/algorithm/copy_if.hpp create mode 100644 sprout/range/algorithm/fixed.hpp create mode 100644 sprout/range/algorithm/fixed/copy.hpp create mode 100644 sprout/range/algorithm/fixed/copy_backward.hpp create mode 100644 sprout/range/algorithm/fixed/copy_if.hpp create mode 100644 sprout/range/algorithm/fixed/merge.hpp create mode 100644 sprout/range/algorithm/fixed/partition_copy.hpp create mode 100644 sprout/range/algorithm/fixed/remove_copy.hpp create mode 100644 sprout/range/algorithm/fixed/remove_copy_if.hpp create mode 100644 sprout/range/algorithm/fixed/replace_copy.hpp create mode 100644 sprout/range/algorithm/fixed/replace_copy_if.hpp create mode 100644 sprout/range/algorithm/fixed/reverse_copy.hpp create mode 100644 sprout/range/algorithm/fixed/rotate_copy.hpp create mode 100644 sprout/range/algorithm/fixed/set_difference.hpp create mode 100644 sprout/range/algorithm/fixed/set_intersection.hpp create mode 100644 sprout/range/algorithm/fixed/set_symmetric_difference.hpp create mode 100644 sprout/range/algorithm/fixed/set_union.hpp create mode 100644 sprout/range/algorithm/fixed/stable_partition_copy.hpp create mode 100644 sprout/range/algorithm/fixed/swap_element_copy.hpp create mode 100644 sprout/range/algorithm/fixed/transform.hpp create mode 100644 sprout/range/algorithm/fixed/unique_copy.hpp create mode 100644 sprout/range/algorithm/infit.hpp create mode 100644 sprout/range/algorithm/infit/copy.hpp create mode 100644 sprout/range/algorithm/infit/copy_backward.hpp create mode 100644 sprout/range/algorithm/infit/copy_if.hpp create mode 100644 sprout/range/algorithm/infit/merge.hpp create mode 100644 sprout/range/algorithm/infit/partition_copy.hpp create mode 100644 sprout/range/algorithm/infit/remove_copy.hpp create mode 100644 sprout/range/algorithm/infit/remove_copy_if.hpp create mode 100644 sprout/range/algorithm/infit/replace_copy.hpp create mode 100644 sprout/range/algorithm/infit/replace_copy_if.hpp create mode 100644 sprout/range/algorithm/infit/reverse_copy.hpp create mode 100644 sprout/range/algorithm/infit/rotate_copy.hpp create mode 100644 sprout/range/algorithm/infit/set_difference.hpp create mode 100644 sprout/range/algorithm/infit/set_intersection.hpp create mode 100644 sprout/range/algorithm/infit/set_symmetric_difference.hpp create mode 100644 sprout/range/algorithm/infit/set_union.hpp create mode 100644 sprout/range/algorithm/infit/stable_partition_copy.hpp create mode 100644 sprout/range/algorithm/infit/swap_element_copy.hpp create mode 100644 sprout/range/algorithm/infit/transform.hpp create mode 100644 sprout/range/algorithm/infit/unique_copy.hpp create mode 100644 sprout/range/algorithm/merge.hpp create mode 100644 sprout/range/algorithm/outfit.hpp create mode 100644 sprout/range/algorithm/outfit/copy.hpp create mode 100644 sprout/range/algorithm/outfit/copy_backward.hpp create mode 100644 sprout/range/algorithm/outfit/copy_if.hpp create mode 100644 sprout/range/algorithm/outfit/merge.hpp create mode 100644 sprout/range/algorithm/outfit/partition_copy.hpp create mode 100644 sprout/range/algorithm/outfit/remove_copy.hpp create mode 100644 sprout/range/algorithm/outfit/remove_copy_if.hpp create mode 100644 sprout/range/algorithm/outfit/replace_copy.hpp create mode 100644 sprout/range/algorithm/outfit/replace_copy_if.hpp create mode 100644 sprout/range/algorithm/outfit/reverse_copy.hpp create mode 100644 sprout/range/algorithm/outfit/rotate_copy.hpp create mode 100644 sprout/range/algorithm/outfit/set_difference.hpp create mode 100644 sprout/range/algorithm/outfit/set_intersection.hpp create mode 100644 sprout/range/algorithm/outfit/set_symmetric_difference.hpp create mode 100644 sprout/range/algorithm/outfit/set_union.hpp create mode 100644 sprout/range/algorithm/outfit/stable_partition_copy.hpp create mode 100644 sprout/range/algorithm/outfit/swap_element_copy.hpp create mode 100644 sprout/range/algorithm/outfit/transform.hpp create mode 100644 sprout/range/algorithm/outfit/unique_copy.hpp create mode 100644 sprout/range/algorithm/partition_copy.hpp create mode 100644 sprout/range/algorithm/remove_copy.hpp create mode 100644 sprout/range/algorithm/remove_copy_if.hpp create mode 100644 sprout/range/algorithm/replace_copy.hpp create mode 100644 sprout/range/algorithm/replace_copy_if.hpp create mode 100644 sprout/range/algorithm/reverse_copy.hpp create mode 100644 sprout/range/algorithm/rotate_copy.hpp create mode 100644 sprout/range/algorithm/set_difference.hpp create mode 100644 sprout/range/algorithm/set_intersection.hpp create mode 100644 sprout/range/algorithm/set_symmetric_difference.hpp create mode 100644 sprout/range/algorithm/set_union.hpp create mode 100644 sprout/range/algorithm/stable_partition_copy.hpp create mode 100644 sprout/range/algorithm/swap_element_copy.hpp create mode 100644 sprout/range/algorithm/transform.hpp create mode 100644 sprout/range/algorithm/unique_copy.hpp create mode 100644 sprout/string.hpp create mode 100644 sprout/sub_array.hpp create mode 100644 user_config.hpp diff --git a/sprout/adapt/sscrisk/cel/array.hpp b/sprout/adapt/sscrisk/cel/array.hpp new file mode 100644 index 00000000..199dc515 --- /dev/null +++ b/sprout/adapt/sscrisk/cel/array.hpp @@ -0,0 +1,24 @@ +#ifndef SPROUT_ADAPT_SSCRISK_CEL_ARRAY_HPP +#define SPROUT_ADAPT_SSCRISK_CEL_ARRAY_HPP + +#include +#include +#include +#include + +namespace sprout { + // + // rebind_fixed_size + // + template + struct rebind_fixed_size > { + public: + template >::size_type S> + struct apply { + public: + typedef sscrisk::cel::array type; + }; + }; +} // namespace sprout + +#endif // #ifndef SPROUT_ADAPT_SSCRISK_CEL_ARRAY_HPP diff --git a/sprout/algorithm.hpp b/sprout/algorithm.hpp new file mode 100644 index 00000000..7c451352 --- /dev/null +++ b/sprout/algorithm.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_HPP +#define SPROUT_ALGORITHM_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_HPP diff --git a/sprout/algorithm/copy.hpp b/sprout/algorithm/copy.hpp new file mode 100644 index 00000000..70f5ad2f --- /dev/null +++ b/sprout/algorithm/copy.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_COPY_HPP +#define SPROUT_ALGORITHM_COPY_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_COPY_HPP diff --git a/sprout/algorithm/copy_backward.hpp b/sprout/algorithm/copy_backward.hpp new file mode 100644 index 00000000..5c129390 --- /dev/null +++ b/sprout/algorithm/copy_backward.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_COPY_BACKWARD_HPP +#define SPROUT_ALGORITHM_COPY_BACKWARD_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_COPY_BACKWARD_HPP diff --git a/sprout/algorithm/copy_if.hpp b/sprout/algorithm/copy_if.hpp new file mode 100644 index 00000000..8761915a --- /dev/null +++ b/sprout/algorithm/copy_if.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_COPY_IF_HPP +#define SPROUT_ALGORITHM_COPY_IF_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_COPY_IF_HPP diff --git a/sprout/algorithm/copy_n.hpp b/sprout/algorithm/copy_n.hpp new file mode 100644 index 00000000..99a3f282 --- /dev/null +++ b/sprout/algorithm/copy_n.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_COPY_N_HPP +#define SPROUT_ALGORITHM_COPY_N_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_COPY_N_HPP diff --git a/sprout/algorithm/fill.hpp b/sprout/algorithm/fill.hpp new file mode 100644 index 00000000..268b3187 --- /dev/null +++ b/sprout/algorithm/fill.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_FILL_HPP +#define SPROUT_ALGORITHM_FILL_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_FILL_HPP diff --git a/sprout/algorithm/fill_n.hpp b/sprout/algorithm/fill_n.hpp new file mode 100644 index 00000000..c9e37e59 --- /dev/null +++ b/sprout/algorithm/fill_n.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_FILL_N_HPP +#define SPROUT_ALGORITHM_FILL_N_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_FILL_N_HPP diff --git a/sprout/algorithm/fixed.hpp b/sprout/algorithm/fixed.hpp new file mode 100644 index 00000000..4352f602 --- /dev/null +++ b/sprout/algorithm/fixed.hpp @@ -0,0 +1,50 @@ +#ifndef SPROUT_ALGORITHM_FIXED_HPP +#define SPROUT_ALGORITHM_FIXED_HPP + +#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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_HPP diff --git a/sprout/algorithm/fixed/copy.hpp b/sprout/algorithm/fixed/copy.hpp new file mode 100644 index 00000000..60650ccf --- /dev/null +++ b/sprout/algorithm/fixed/copy.hpp @@ -0,0 +1,56 @@ +#ifndef SPROUT_ALGORITHM_FIXED_COPY_HPP +#define SPROUT_ALGORITHM_FIXED_COPY_HPP + +#include +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type copy_impl( + Iterator first, + Iterator last, + Result const& result, + sprout::index_tuple, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::size_type size, + typename sprout::fixed_container_traits::size_type input_size + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{ + (Indexes >= offset && Indexes < offset + size && Indexes < offset + input_size + ? *(first + Indexes - offset) + : *(sprout::fixed_begin(result) + Indexes) + )... + }; + } + } // namespace detail + // + // copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type copy( + Iterator first, + Iterator last, + Result const& result + ) + { + return sprout::fixed::detail::copy_impl( + first, + last, + result, + typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), + sprout::fixed_begin_offset(result), + sprout::size(result), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_COPY_HPP diff --git a/sprout/algorithm/fixed/copy_backward.hpp b/sprout/algorithm/fixed/copy_backward.hpp new file mode 100644 index 00000000..79f41c90 --- /dev/null +++ b/sprout/algorithm/fixed/copy_backward.hpp @@ -0,0 +1,56 @@ +#ifndef SPROUT_ALGORITHM_FIXED_COPY_BACKWARD_HPP +#define SPROUT_ALGORITHM_FIXED_COPY_BACKWARD_HPP + +#include +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type copy_backward_impl( + Iterator first, + Iterator last, + Result const& result, + sprout::index_tuple, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::size_type size, + typename sprout::fixed_container_traits::size_type input_size + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{ + (Indexes < offset && Indexes + size >= offset && Indexes + input_size >= offset + ? *(last + Indexes - offset) + : *(sprout::fixed_begin(result) + Indexes) + )... + }; + } + } // namespace detail + // + // copy_backward + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type copy_backward( + Iterator first, + Iterator last, + Result const& result + ) + { + return sprout::fixed::detail::copy_backward_impl( + first, + last, + result, + typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), + sprout::fixed_end_offset(result), + sprout::size(result), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_COPY_BACKWARD_HPP diff --git a/sprout/algorithm/fixed/copy_if.hpp b/sprout/algorithm/fixed/copy_if.hpp new file mode 100644 index 00000000..910d1c78 --- /dev/null +++ b/sprout/algorithm/fixed/copy_if.hpp @@ -0,0 +1,129 @@ +#ifndef SPROUT_ALGORITHM_FIXED_COPY_IF_HPP +#define SPROUT_ALGORITHM_FIXED_COPY_IF_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type copy_if_impl_3( + Result const& result, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type copy_if_impl_3( + Result const& result, + Args const&... args + ) + { + return copy_if_impl_3(result, args..., *(sprout::fixed_begin(result) + sizeof...(Args))); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type copy_if_impl_2( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type copy_if_impl_2( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return first != last && sizeof...(Args) < offset + ? pred(*first) + ? copy_if_impl_2(first + 1, last, result, pred, offset, args..., *first) + : copy_if_impl_2(first + 1, last, result, pred, offset, args...) + : copy_if_impl_3(result, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type copy_if_impl_1( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type copy_if_impl_1( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < offset + ? copy_if_impl_1(first, last, result, pred, offset, args..., *(sprout::fixed_begin(result) + sizeof...(Args))) + : copy_if_impl_2(first, last, result, pred, offset + sprout::size(result), args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type copy_if_impl( + Iterator first, + Iterator last, + Result const& result, + Predicate pred + ) + { + return copy_if_impl_1(first, last, result, pred, sprout::fixed_begin_offset(result)); + } + } // namespace detail + // + // copy_if + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type copy_if( + Iterator first, + Iterator last, + Result const& result, + Predicate pred + ) + { + return sprout::fixed::detail::copy_if_impl(first, last, result, pred); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_COPY_IF_HPP diff --git a/sprout/algorithm/fixed/copy_n.hpp b/sprout/algorithm/fixed/copy_n.hpp new file mode 100644 index 00000000..8c57a73f --- /dev/null +++ b/sprout/algorithm/fixed/copy_n.hpp @@ -0,0 +1,34 @@ +#ifndef SPROUT_ALGORITHM_FIXED_COPY_N_HPP +#define SPROUT_ALGORITHM_FIXED_COPY_N_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + // + // copy_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type copy_n( + Iterator first, + Size n, + Result const& result + ) + { + return sprout::fixed::detail::copy_impl( + first, + first + n, + result, + typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), + sprout::fixed_begin_offset(result), + sprout::size(result), + n + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_COPY_N_HPP diff --git a/sprout/algorithm/fixed/fill.hpp b/sprout/algorithm/fixed/fill.hpp new file mode 100644 index 00000000..fe9ce28b --- /dev/null +++ b/sprout/algorithm/fixed/fill.hpp @@ -0,0 +1,50 @@ +#ifndef SPROUT_ALGORITHM_FIXED_FILL_HPP +#define SPROUT_ALGORITHM_FIXED_FILL_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type fill_impl( + Container const& cont, + sprout::index_tuple, + T const& value, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::size_type size + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{ + (Indexes >= offset && Indexes < offset + size + ? value + : *(sprout::fixed_begin(cont) + Indexes) + )... + }; + } + } // namespace detail + // + // fill + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type fill( + Container const& cont, + T const& value + ) + { + return sprout::fixed::detail::fill_impl( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), + value, + sprout::fixed_begin_offset(cont), + sprout::size(cont) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_FILL_HPP diff --git a/sprout/algorithm/fixed/fill_n.hpp b/sprout/algorithm/fixed/fill_n.hpp new file mode 100644 index 00000000..2a7c09e2 --- /dev/null +++ b/sprout/algorithm/fixed/fill_n.hpp @@ -0,0 +1,33 @@ +#ifndef SPROUT_ALGORITHM_FIXED_FILL_N_HPP +#define SPROUT_ALGORITHM_FIXED_FILL_N_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + // + // fill_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type fill_n( + Container const& cont, + Size n, + T const& value + ) + { + return sprout::fixed::detail::fill_impl( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), + value, + sprout::fixed_begin_offset(cont), + n + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_FILL_N_HPP diff --git a/sprout/algorithm/fixed/generate.hpp b/sprout/algorithm/fixed/generate.hpp new file mode 100644 index 00000000..3c75f702 --- /dev/null +++ b/sprout/algorithm/fixed/generate.hpp @@ -0,0 +1,193 @@ +#ifndef SPROUT_ALGORITHM_FIXED_GENERATE_HPP +#define SPROUT_ALGORITHM_FIXED_GENERATE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + InitSize == sizeof...(Args) + 1, + typename sprout::fixed_container_traits::value_type + >::type call_gen( + Generator gen, + Head const& head, + Args const&... args + ) + { + return gen(head, args...); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + InitSize != sizeof...(Args) + 1, + typename sprout::fixed_container_traits::value_type + >::type call_gen( + Generator gen, + Head const& head, + Args const&... args + ) + { + return call_gen(gen, args...); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type generate_impl_4( + Container const& cont, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type generate_impl_4( + Container const& cont, + Args const&... args + ) + { + return generate_impl_4(cont, args..., *(sprout::fixed_begin(cont) + sizeof...(Args))); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type generate_impl_3( + Container const& cont, + Generator gen, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type generate_impl_3( + Container const& cont, + Generator gen, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < offset + ? generate_impl_3(cont, gen, offset, args..., call_gen(gen, args...)) + : generate_impl_4(cont, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sizeof...(Args) == 0, + typename sprout::fixed_container_traits::fixed_container_type + >::type generate_impl_2_drop( + Container const& cont, + typename sprout::fixed_container_traits::size_type dropped_size, + Head const& head, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sizeof...(Args) != 0, + typename sprout::fixed_container_traits::fixed_container_type + >::type generate_impl_2_drop( + Container const& cont, + typename sprout::fixed_container_traits::size_type dropped_size, + Head const& head, + Args const&... args + ) + { + return sizeof...(Args) + 1 != dropped_size + ? generate_impl_2_drop(cont, dropped_size, args...) + : generate_impl_4(cont, head, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type generate_impl_2( + Container const& cont, + Generator gen, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::size_type size, + std::size_t remain, + Head const& head, + Args const&... args + ) + { + return InitSize - remain != size + ? (remain > 1 + ? generate_impl_2(cont, gen, offset, size, remain - 1, args..., head) + : generate_impl_3(cont, gen, offset + size, args..., head) + ) + : generate_impl_2_drop(cont, offset + size, head, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type generate_impl_1( + Container const& cont, + Generator gen, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::size_type size, + Args const&... args + ) + { + return generate_impl_2(cont, gen, offset, size, InitSize, args...); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type generate_impl_1( + Container const& cont, + Generator gen, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::size_type size, + Args const&... args + ) + { + return sizeof...(Args) - InitSize < offset + ? generate_impl_1(cont, gen, offset, size, args..., *(sprout::fixed_begin(cont) + sizeof...(Args) - InitSize)) + : generate_impl_2(cont, gen, offset, size, InitSize, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type generate_impl( + Container const& cont, + Generator gen, + typename sprout::fixed_container_traits::size_type size, + Inits const&... inits + ) + { + return generate_impl_1(cont, gen, sprout::fixed_begin_offset(cont), size, inits...); + } + } // namespace detail + // + // generate + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type generate( + Container const& cont, + Generator gen, + Inits const&... inits + ) + { + return sprout::fixed::detail::generate_impl(cont, gen, sprout::size(cont), inits...); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_GENERATE_HPP diff --git a/sprout/algorithm/fixed/generate_n.hpp b/sprout/algorithm/fixed/generate_n.hpp new file mode 100644 index 00000000..a2bb7ed3 --- /dev/null +++ b/sprout/algorithm/fixed/generate_n.hpp @@ -0,0 +1,26 @@ +#ifndef SPROUT_ALGORITHM_FIXED_GENERATE_N_HPP +#define SPROUT_ALGORITHM_FIXED_GENERATE_N_HPP + +#include +#include +#include + +namespace sprout { + namespace fixed { + // + // generate_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type generate_n( + Container const& cont, + Size n, + Generator gen, + Inits const&... inits + ) + { + return sprout::fixed::detail::generate_impl(cont, gen, n, inits...); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_GENERATE_N_HPP diff --git a/sprout/algorithm/fixed/inplace_merge.hpp b/sprout/algorithm/fixed/inplace_merge.hpp new file mode 100644 index 00000000..3eaeb50f --- /dev/null +++ b/sprout/algorithm/fixed/inplace_merge.hpp @@ -0,0 +1,50 @@ +#ifndef SPROUT_ALGORITHM_FIXED_INPLACE_MERGE_HPP +#define SPROUT_ALGORITHM_FIXED_INPLACE_MERGE_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + // + // inplace_merge + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type inplace_merge( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + Compare comp + ) + { + return sprout::fixed::merge( + sprout::begin(cont), + middle, + middle, + sprout::end(cont), + cont, + comp + ); + } + // + // inplace_merge + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type inplace_merge( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle + ) + { + return sprout::fixed::merge( + sprout::begin(cont), + middle, + middle, + sprout::end(cont), + cont + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_INPLACE_MERGE_HPP diff --git a/sprout/algorithm/fixed/make_heap.hpp b/sprout/algorithm/fixed/make_heap.hpp new file mode 100644 index 00000000..c27451ab --- /dev/null +++ b/sprout/algorithm/fixed/make_heap.hpp @@ -0,0 +1,122 @@ +#ifndef SPROUT_ALGORITHM_FIXED_POP_HEAP_HPP +#define SPROUT_ALGORITHM_FIXED_POP_HEAP_HPP + +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type make_heap_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::difference_type size, + typename sprout::fixed_container_traits::difference_type n = 0, + typename sprout::fixed_container_traits::difference_type l = 1, + typename sprout::fixed_container_traits::difference_type r = 2 + ); + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type make_heap_impl_1( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::difference_type size, + typename sprout::fixed_container_traits::difference_type n, + typename sprout::fixed_container_traits::difference_type l, + typename sprout::fixed_container_traits::difference_type r + ) + { + return comp(*(sprout::fixed_begin(cont) + offset + l), *(sprout::fixed_begin(cont) + offset + r)) + ? comp(*(sprout::fixed_begin(cont) + offset + n), *(sprout::fixed_begin(cont) + offset + r)) + ? sprout::fixed::detail::make_heap_impl( + sprout::fixed::swap_element(cont, sprout::fixed_begin(cont) + offset + n, sprout::fixed_begin(cont) + offset + r), + comp, + offset, + size, + r, + r * 2 + 1, + r * 2 + 2 + ) + : sprout::get_fixed_copy(cont) + : comp(*(sprout::fixed_begin(cont) + offset + n), *(sprout::fixed_begin(cont) + offset + l)) + ? sprout::fixed::detail::make_heap_impl( + sprout::fixed::swap_element(cont, sprout::fixed_begin(cont) + offset + n, sprout::fixed_begin(cont) + offset + l), + comp, + offset, + size, + l, + l * 2 + 1, + l * 2 + 2 + ) + : sprout::get_fixed_copy(cont) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type make_heap_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::difference_type size, + typename sprout::fixed_container_traits::difference_type n, + typename sprout::fixed_container_traits::difference_type l, + typename sprout::fixed_container_traits::difference_type r + ) + { + return r > size + ? sprout::get_fixed_copy(cont) + : r == size + ? comp(*(sprout::fixed_begin(cont) + offset + n), *(sprout::fixed_begin(cont) + offset + l)) + ? sprout::fixed::swap_element(cont, sprout::fixed_begin(cont) + offset + n, sprout::fixed_begin(cont) + offset + l) + : sprout::get_fixed_copy(cont) + : sprout::fixed::detail::make_heap_impl_1( + sprout::fixed::detail::make_heap_impl(sprout::fixed::detail::make_heap_impl(cont, comp, offset, size, l, l * 2 + 1, l * 2 + 2), comp, offset, size, r, r * 2 + 1, r * 2 + 2), + comp, + offset, + size, + n, + l, + r + ) + ; + } + } // namespace detail + // + // make_heap + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type make_heap( + Container const& cont, + Compare comp + ) + { + return sprout::fixed::detail::make_heap_impl( + cont, + comp, + sprout::fixed_begin_offset(cont), + sprout::size(cont) + ); + } + // + // make_heap + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type make_heap( + Container const& cont + ) + { + return sprout::fixed::detail::make_heap_impl( + cont, + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::less::value_type>(), + sprout::fixed_begin_offset(cont), + sprout::size(cont) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_POP_HEAP_HPP diff --git a/sprout/algorithm/fixed/make_partial_heap.hpp b/sprout/algorithm/fixed/make_partial_heap.hpp new file mode 100644 index 00000000..d17d7e3d --- /dev/null +++ b/sprout/algorithm/fixed/make_partial_heap.hpp @@ -0,0 +1,102 @@ +#ifndef SPROUT_ALGORITHM_FIXED_MAKE_PARTIAL_HEAP_HPP +#define SPROUT_ALGORITHM_FIXED_MAKE_PARTIAL_HEAP_HPP + +#include +#include +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type make_partial_heap_impl_1( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::difference_type size, + typename sprout::fixed_container_traits::difference_type middle_size, + typename sprout::fixed_container_traits::difference_type n + ) + { + return n < size + ? comp(*(sprout::fixed_begin(cont) + offset + n), *(sprout::fixed_begin(cont) + offset)) + ? sprout::fixed::detail::make_partial_heap_impl_1( + sprout::fixed::detail::pop_heap_impl( + sprout::fixed::swap_element(cont, sprout::fixed_begin(cont) + offset + n, sprout::fixed_begin(cont) + offset), + comp, + offset, + middle_size + ), + comp, + offset, + size, + middle_size, + n + 1 + ) + : sprout::fixed::detail::make_partial_heap_impl_1(cont, comp, offset, size, middle_size, n + 1) + : sprout::get_fixed_copy(cont) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type make_partial_heap_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::difference_type size, + typename sprout::fixed_container_traits::difference_type middle_size + ) + { + return sprout::fixed::detail::make_partial_heap_impl_1( + sprout::fixed::detail::make_heap_impl(cont, comp, offset, middle_size), + comp, + offset, + size, + middle_size, + middle_size + ); + } + } // namespace detail + // + // make_partial_heap + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type make_partial_heap( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + Compare comp + ) + { + return sprout::fixed::detail::make_partial_heap_impl( + cont, + comp, + sprout::fixed_begin_offset(cont), + sprout::size(cont), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::begin(cont), middle) + ); + } + // + // make_partial_heap + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type make_partial_heap( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle + ) + { + return sprout::fixed::detail::make_partial_heap_impl( + cont, + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::less::value_type>(), + sprout::fixed_begin_offset(cont), + sprout::size(cont), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::begin(cont), middle) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_MAKE_PARTIAL_HEAP_HPP diff --git a/sprout/algorithm/fixed/merge.hpp b/sprout/algorithm/fixed/merge.hpp new file mode 100644 index 00000000..9ad34674 --- /dev/null +++ b/sprout/algorithm/fixed/merge.hpp @@ -0,0 +1,176 @@ +#ifndef SPROUT_ALGORITHM_FIXED_MERGE_HPP +#define SPROUT_ALGORITHM_FIXED_MERGE_HPP + +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type merge_impl_3( + Result const& result, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type merge_impl_3( + Result const& result, + Args const&... args + ) + { + return merge_impl_3(result, args..., *(sprout::fixed_begin(result) + sizeof...(Args))); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type merge_impl_2( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type merge_impl_2( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < offset + ? first1 != last1 + ? first2 != last2 + ? comp(*first2, *first1) + ? merge_impl_2(first1, last1, first2 + 1, last2, result, comp, offset, args..., *first2) + : merge_impl_2(first1 + 1, last1, first2, last2, result, comp, offset, args..., *first1) + : merge_impl_2(first1 + 1, last1, first2, last2, result, comp, offset, args..., *first1) + : first2 != last2 + ? merge_impl_2(first1, last1, first2 + 1, last2, result, comp, offset, args..., *first2) + : merge_impl_3(result, args...) + : merge_impl_3(result, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type merge_impl_1( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type merge_impl_1( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < offset + ? merge_impl_1(first1, last1, first2, last2, result, comp, offset, args..., *(sprout::fixed_begin(result) + sizeof...(Args))) + : merge_impl_2(first1, last1, first2, last2, result, comp, offset + sprout::size(result), args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type merge_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return merge_impl_1(first1, last1, first2, last2, result, comp, sprout::fixed_begin_offset(result)); + } + } // namespace detail + // + // merge + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type merge( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return sprout::fixed::detail::merge_impl( + first1, + last1, + first2, + last2, + result, + comp + ); + } + // + // merge + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type merge( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result + ) + { + return sprout::fixed::detail::merge_impl( + first1, + last1, + first2, + last2, + result, + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::less::value_type>() + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_MERGE_HPP diff --git a/sprout/algorithm/fixed/nth_element.hpp b/sprout/algorithm/fixed/nth_element.hpp new file mode 100644 index 00000000..d310108a --- /dev/null +++ b/sprout/algorithm/fixed/nth_element.hpp @@ -0,0 +1,82 @@ +#ifndef SPROUT_ALGORITHM_FIXED_NTH_ELEMENT_HPP +#define SPROUT_ALGORITHM_FIXED_NTH_ELEMENT_HPP + +#include +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type nth_element_impl_1( + Container const& cont, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::difference_type nth_size + ) + { + return sprout::fixed::swap_element( + cont, + sprout::fixed_begin(cont) + offset, + sprout::fixed_begin(cont) + offset + nth_size + ); + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type nth_element_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::difference_type size, + typename sprout::fixed_container_traits::difference_type nth_size + ) + { + return sprout::fixed::detail::nth_element_impl_1( + sprout::fixed::detail::make_partial_heap_impl(cont, comp, offset, size, nth_size + 1), + offset, + nth_size + ); + } + } // namespace detail + // + // nth_element + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type nth_element( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator nth, + Compare comp + ) + { + return sprout::fixed::detail::nth_element_impl( + cont, + comp, + sprout::fixed_begin_offset(cont), + sprout::size(cont), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::begin(cont), nth) + ); + } + // + // nth_element + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type nth_element( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator nth + ) + { + return sprout::fixed::detail::nth_element_impl( + cont, + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::less::value_type>(), + sprout::fixed_begin_offset(cont), + sprout::size(cont), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::begin(cont), nth) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_NTH_ELEMENT_HPP diff --git a/sprout/algorithm/fixed/partial_sort.hpp b/sprout/algorithm/fixed/partial_sort.hpp new file mode 100644 index 00000000..45e6cd6d --- /dev/null +++ b/sprout/algorithm/fixed/partial_sort.hpp @@ -0,0 +1,70 @@ +#ifndef SPROUT_ALGORITHM_FIXED_PARTIAL_SORT_HPP +#define SPROUT_ALGORITHM_FIXED_PARTIAL_SORT_HPP + +#include +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type partial_sort_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::difference_type size, + typename sprout::fixed_container_traits::difference_type middle_size + ) + { + return sprout::fixed::detail::sort_heap_impl( + sprout::fixed::detail::make_partial_heap_impl(cont, comp, offset, size, middle_size), + comp, + offset, + middle_size + ); + } + } // namespace detail + // + // partial_sort + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type partial_sort( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + Compare comp + ) + { + return sprout::fixed::detail::partial_sort_impl( + cont, + comp, + sprout::fixed_begin_offset(cont), + sprout::size(cont), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::begin(cont), middle) + ); + } + // + // partial_sort + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type partial_sort( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle + ) + { + return sprout::fixed::detail::partial_sort_impl( + cont, + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::less::value_type>(), + sprout::fixed_begin_offset(cont), + sprout::size(cont), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::begin(cont), middle) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_PARTIAL_SORT_HPP diff --git a/sprout/algorithm/fixed/partition.hpp b/sprout/algorithm/fixed/partition.hpp new file mode 100644 index 00000000..632c5cc7 --- /dev/null +++ b/sprout/algorithm/fixed/partition.hpp @@ -0,0 +1,25 @@ +#ifndef SPROUT_ALGORITHM_FIXED_PARTITION_HPP +#define SPROUT_ALGORITHM_FIXED_PARTITION_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + // + // partition + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type partition( + Container const& cont, + Predicate pred + ) + { + return sprout::fixed::partition_copy(sprout::begin(cont), sprout::end(cont), cont, pred); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_PARTITION_HPP diff --git a/sprout/algorithm/fixed/partition_copy.hpp b/sprout/algorithm/fixed/partition_copy.hpp new file mode 100644 index 00000000..9c6510e6 --- /dev/null +++ b/sprout/algorithm/fixed/partition_copy.hpp @@ -0,0 +1,129 @@ +#ifndef SPROUT_ALGORITHM_FIXED_PARTITION_COPY_HPP +#define SPROUT_ALGORITHM_FIXED_PARTITION_COPY_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type partition_copy_impl_3( + Result const& result, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type partition_copy_impl_3( + Result const& result, + Args const&... args + ) + { + return partition_copy_impl_3(result, args..., *(sprout::fixed_begin(result) + sizeof...(Args))); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type partition_copy_impl_2( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type partition_copy_impl_2( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return first != last && sizeof...(Args) < offset + ? pred(*first) + ? partition_copy_impl_2(first + 1, last, result, pred, offset, *first, args...) + : partition_copy_impl_2(first + 1, last, result, pred, offset, args..., *first) + : partition_copy_impl_3(result, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type partition_copy_impl_1( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type partition_copy_impl_1( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < offset + ? partition_copy_impl_1(first, last, result, pred, offset, args..., *(sprout::fixed_begin(result) + sizeof...(Args))) + : partition_copy_impl_2(first, last, result, pred, offset + sprout::size(result), args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type partition_copy_impl( + Iterator first, + Iterator last, + Result const& result, + Predicate pred + ) + { + return partition_copy_impl_1(first, last, result, pred, sprout::fixed_begin_offset(result)); + } + } // namespace detail + // + // partition_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type partition_copy( + Iterator first, + Iterator last, + Result const& result, + Predicate pred + ) + { + return sprout::fixed::detail::partition_copy_impl(first, last, result, pred); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_PARTITION_COPY_HPP diff --git a/sprout/algorithm/fixed/pop_heap.hpp b/sprout/algorithm/fixed/pop_heap.hpp new file mode 100644 index 00000000..a837c7ed --- /dev/null +++ b/sprout/algorithm/fixed/pop_heap.hpp @@ -0,0 +1,86 @@ +#ifndef SPROUT_ALGORITHM_FIXED_POP_HEAP_HPP +#define SPROUT_ALGORITHM_FIXED_POP_HEAP_HPP + +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type pop_heap_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::difference_type size, + typename sprout::fixed_container_traits::difference_type n = 0, + typename sprout::fixed_container_traits::difference_type l = 1, + typename sprout::fixed_container_traits::difference_type r = 2 + ) + { + return r < size && comp(*(sprout::fixed_begin(cont) + offset + l), *(sprout::fixed_begin(cont) + offset + r)) + ? comp(*(sprout::fixed_begin(cont) + offset + n), *(sprout::fixed_begin(cont) + offset + r)) + ? sprout::fixed::detail::pop_heap_impl( + sprout::fixed::swap_element(cont, sprout::fixed_begin(cont) + offset + n, sprout::fixed_begin(cont) + offset + r), + comp, + offset, + size, + r, + r * 2 + 1, + r * 2 + 2 + ) + : sprout::get_fixed_copy(cont) + : l < size + ? comp(*(sprout::fixed_begin(cont) + offset + n), *(sprout::fixed_begin(cont) + offset + l)) + ? sprout::fixed::detail::pop_heap_impl( + sprout::fixed::swap_element(cont, sprout::fixed_begin(cont) + offset + n, sprout::fixed_begin(cont) + offset + l), + comp, + offset, + size, + l, + l * 2 + 1, + l * 2 + 2 + ) + : sprout::get_fixed_copy(cont) + : sprout::get_fixed_copy(cont) + ; + } + } // namespace detail + // + // pop_heap + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type pop_heap( + Container const& cont, + Compare comp + ) + { + return sprout::fixed::detail::pop_heap_impl( + sprout::fixed::swap_element(cont, sprout::begin(cont), sprout::end(cont) - 1), + comp, + sprout::fixed_begin_offset(cont), + sprout::size(cont) - 1 + ); + } + // + // pop_heap + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type pop_heap( + Container const& cont + ) + { + return sprout::fixed::detail::pop_heap_impl( + sprout::fixed::swap_element(cont, sprout::begin(cont), sprout::end(cont) - 1), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::less::value_type>(), + sprout::fixed_begin_offset(cont), + sprout::size(cont) - 1 + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_POP_HEAP_HPP diff --git a/sprout/algorithm/fixed/push_heap.hpp b/sprout/algorithm/fixed/push_heap.hpp new file mode 100644 index 00000000..29ca1801 --- /dev/null +++ b/sprout/algorithm/fixed/push_heap.hpp @@ -0,0 +1,66 @@ +#ifndef SPROUT_ALGORITHM_FIXED_PUSH_HEAP_HPP +#define SPROUT_ALGORITHM_FIXED_PUSH_HEAP_HPP + +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type push_heap_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::difference_type n + ) + { + return n != 0 && comp(*(sprout::fixed_begin(cont) + offset + (n - 1) / 2), *(sprout::fixed_begin(cont) + offset + n)) + ? sprout::fixed::detail::push_heap_impl( + sprout::fixed::swap_element(cont, sprout::fixed_begin(cont) + offset + (n - 1) / 2, sprout::fixed_begin(cont) + offset + n), + comp, + offset, + (n - 1) / 2 + ) + : sprout::get_fixed_copy(cont) + ; + } + } // namespace detail + // + // push_heap + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type push_heap( + Container const& cont, + Compare comp + ) + { + return sprout::fixed::detail::push_heap_impl( + cont, + comp, + sprout::fixed_begin_offset(cont), + sprout::size(cont) - 1 + ); + } + // + // push_heap + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type push_heap( + Container const& cont + ) + { + return sprout::fixed::detail::push_heap_impl( + cont, + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::less::value_type>(), + sprout::fixed_begin_offset(cont), + sprout::size(cont) - 1 + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_PUSH_HEAP_HPP diff --git a/sprout/algorithm/fixed/remove.hpp b/sprout/algorithm/fixed/remove.hpp new file mode 100644 index 00000000..8f8917d4 --- /dev/null +++ b/sprout/algorithm/fixed/remove.hpp @@ -0,0 +1,25 @@ +#ifndef SPROUT_ALGORITHM_FIXED_REMOVE_HPP +#define SPROUT_ALGORITHM_FIXED_REMOVE_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + // + // remove + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type remove( + Container const& cont, + T const& value + ) + { + return sprout::fixed::remove_copy(sprout::begin(cont), sprout::end(cont), cont, value); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_REMOVE_HPP diff --git a/sprout/algorithm/fixed/remove_copy.hpp b/sprout/algorithm/fixed/remove_copy.hpp new file mode 100644 index 00000000..ac3f0f92 --- /dev/null +++ b/sprout/algorithm/fixed/remove_copy.hpp @@ -0,0 +1,129 @@ +#ifndef SPROUT_ALGORITHM_FIXED_REMOVE_COPY_HPP +#define SPROUT_ALGORITHM_FIXED_REMOVE_COPY_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type remove_copy_impl_3( + Result const& result, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type remove_copy_impl_3( + Result const& result, + Args const&... args + ) + { + return remove_copy_impl_3(result, args..., *(sprout::fixed_begin(result) + sizeof...(Args))); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type remove_copy_impl_2( + Iterator first, + Iterator last, + Result const& result, + T const& value, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type remove_copy_impl_2( + Iterator first, + Iterator last, + Result const& result, + T const& value, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return first != last && sizeof...(Args) < offset + ? *first == value + ? remove_copy_impl_2(first + 1, last, result, value, offset, args...) + : remove_copy_impl_2(first + 1, last, result, value, offset, args..., *first) + : remove_copy_impl_3(result, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type remove_copy_impl_1( + Iterator first, + Iterator last, + Result const& result, + T const& value, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type remove_copy_impl_1( + Iterator first, + Iterator last, + Result const& result, + T const& value, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < offset + ? remove_copy_impl_1(first, last, result, value, offset, args..., *(sprout::fixed_begin(result) + sizeof...(Args))) + : remove_copy_impl_2(first, last, result, value, offset + sprout::size(result), args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type remove_copy_impl( + Iterator first, + Iterator last, + Result const& result, + T const& value + ) + { + return remove_copy_impl_1(first, last, result, value, sprout::fixed_begin_offset(result)); + } + } // namespace detail + // + // remove_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type remove_copy( + Iterator first, + Iterator last, + Result const& result, + T const& value + ) + { + return sprout::fixed::detail::remove_copy_impl(first, last, result, value); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_REMOVE_COPY_HPP diff --git a/sprout/algorithm/fixed/remove_copy_if.hpp b/sprout/algorithm/fixed/remove_copy_if.hpp new file mode 100644 index 00000000..83c6a7fd --- /dev/null +++ b/sprout/algorithm/fixed/remove_copy_if.hpp @@ -0,0 +1,129 @@ +#ifndef SPROUT_ALGORITHM_FIXED_REMOVE_COPY_IF_HPP +#define SPROUT_ALGORITHM_FIXED_REMOVE_COPY_IF_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type remove_copy_if_impl_3( + Result const& result, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type remove_copy_if_impl_3( + Result const& result, + Args const&... args + ) + { + return remove_copy_if_impl_3(result, args..., *(sprout::fixed_begin(result) + sizeof...(Args))); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type remove_copy_if_impl_2( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type remove_copy_if_impl_2( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return first != last && sizeof...(Args) < offset + ? pred(*first) + ? remove_copy_if_impl_2(first + 1, last, result, pred, offset, args...) + : remove_copy_if_impl_2(first + 1, last, result, pred, offset, args..., *first) + : remove_copy_if_impl_3(result, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type remove_copy_if_impl_1( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type remove_copy_if_impl_1( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < offset + ? remove_copy_if_impl_1(first, last, result, pred, offset, args..., *(sprout::fixed_begin(result) + sizeof...(Args))) + : remove_copy_if_impl_2(first, last, result, pred, offset + sprout::size(result), args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type remove_copy_if_impl( + Iterator first, + Iterator last, + Result const& result, + Predicate pred + ) + { + return remove_copy_if_impl_1(first, last, result, pred, sprout::fixed_begin_offset(result)); + } + } // namespace detail + // + // remove_copy_if + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type remove_copy_if( + Iterator first, + Iterator last, + Result const& result, + Predicate pred + ) + { + return sprout::fixed::detail::remove_copy_if_impl(first, last, result, pred); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_REMOVE_COPY_IF_HPP diff --git a/sprout/algorithm/fixed/remove_if.hpp b/sprout/algorithm/fixed/remove_if.hpp new file mode 100644 index 00000000..b3c75f40 --- /dev/null +++ b/sprout/algorithm/fixed/remove_if.hpp @@ -0,0 +1,25 @@ +#ifndef SPROUT_ALGORITHM_FIXED_REMOVE_IF_HPP +#define SPROUT_ALGORITHM_FIXED_REMOVE_IF_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + // + // remove_if + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type remove_if( + Container const& cont, + Predicate pred + ) + { + return sprout::fixed::remove_copy_if(sprout::begin(cont), sprout::end(cont), cont, pred); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_REMOVE_IF_HPP diff --git a/sprout/algorithm/fixed/replace.hpp b/sprout/algorithm/fixed/replace.hpp new file mode 100644 index 00000000..afb9d7de --- /dev/null +++ b/sprout/algorithm/fixed/replace.hpp @@ -0,0 +1,26 @@ +#ifndef SPROUT_ALGORITHM_FIXED_REPLACE_HPP +#define SPROUT_ALGORITHM_FIXED_REPLACE_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + // + // replace + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type replace( + Container const& cont, + T const& old_value, + T const& new_value + ) + { + return sprout::fixed::replace_copy(sprout::begin(cont), sprout::end(cont), cont, old_value, new_value); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_REPLACE_HPP diff --git a/sprout/algorithm/fixed/replace_copy.hpp b/sprout/algorithm/fixed/replace_copy.hpp new file mode 100644 index 00000000..d4cbf7e9 --- /dev/null +++ b/sprout/algorithm/fixed/replace_copy.hpp @@ -0,0 +1,62 @@ +#ifndef SPROUT_ALGORITHM_FIXED_REPLACE_COPY_HPP +#define SPROUT_ALGORITHM_FIXED_REPLACE_COPY_HPP + +#include +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type replace_copy_impl( + Iterator first, + Iterator last, + Result const& result, + sprout::index_tuple, + T const& old_value, + T const& new_value, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::size_type size, + typename sprout::fixed_container_traits::size_type input_size + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{ + (Indexes >= offset && Indexes < offset + size && Indexes < offset + input_size + ? *(first + Indexes - offset) == old_value ? new_value : *(first + Indexes - offset) + : *(sprout::fixed_begin(result) + Indexes) + )... + }; + } + } // namespace detail + // + // replace_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type replace_copy( + Iterator first, + Iterator last, + Result const& result, + T const& old_value, + T const& new_value + ) + { + return sprout::fixed::detail::replace_copy_impl( + first, + last, + result, + typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), + old_value, + new_value, + sprout::fixed_begin_offset(result), + sprout::size(result), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_REPLACE_COPY_HPP diff --git a/sprout/algorithm/fixed/replace_copy_if.hpp b/sprout/algorithm/fixed/replace_copy_if.hpp new file mode 100644 index 00000000..5a854961 --- /dev/null +++ b/sprout/algorithm/fixed/replace_copy_if.hpp @@ -0,0 +1,62 @@ +#ifndef SPROUT_ALGORITHM_FIXED_REPLACE_COPY_IF_HPP +#define SPROUT_ALGORITHM_FIXED_REPLACE_COPY_IF_HPP + +#include +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type replace_copy_if_impl( + Iterator first, + Iterator last, + Result const& result, + sprout::index_tuple, + Predicate pred, + T const& new_value, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::size_type size, + typename sprout::fixed_container_traits::size_type input_size + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{ + (Indexes >= offset && Indexes < offset + size && Indexes < offset + input_size + ? pred(*(first + Indexes - offset)) ? new_value : *(first + Indexes - offset) + : *(sprout::fixed_begin(result) + Indexes) + )... + }; + } + } // namespace detail + // + // replace_copy_if + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type replace_copy_if( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + T const& new_value + ) + { + return sprout::fixed::detail::replace_copy_if_impl( + first, + last, + result, + typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), + pred, + new_value, + sprout::fixed_begin_offset(result), + sprout::size(result), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_REPLACE_COPY_IF_HPP diff --git a/sprout/algorithm/fixed/replace_if.hpp b/sprout/algorithm/fixed/replace_if.hpp new file mode 100644 index 00000000..8c3cc5ff --- /dev/null +++ b/sprout/algorithm/fixed/replace_if.hpp @@ -0,0 +1,26 @@ +#ifndef SPROUT_ALGORITHM_FIXED_REPLACE_IF_HPP +#define SPROUT_ALGORITHM_FIXED_REPLACE_IF_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + // + // replace_if + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type replace_if( + Container const& cont, + Predicate pred, + T const& new_value + ) + { + return sprout::fixed::replace_copy_if(sprout::begin(cont), sprout::end(cont), cont, pred, new_value); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_REPLACE_IF_HPP diff --git a/sprout/algorithm/fixed/reverse.hpp b/sprout/algorithm/fixed/reverse.hpp new file mode 100644 index 00000000..bcd09521 --- /dev/null +++ b/sprout/algorithm/fixed/reverse.hpp @@ -0,0 +1,24 @@ +#ifndef SPROUT_ALGORITHM_FIXED_REVERSE_HPP +#define SPROUT_ALGORITHM_FIXED_REVERSE_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + // + // reverse + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type reverse( + Container const& cont + ) + { + return sprout::fixed::reverse_copy(sprout::begin(cont), sprout::end(cont), cont); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_REVERSE_HPP diff --git a/sprout/algorithm/fixed/reverse_copy.hpp b/sprout/algorithm/fixed/reverse_copy.hpp new file mode 100644 index 00000000..badacd64 --- /dev/null +++ b/sprout/algorithm/fixed/reverse_copy.hpp @@ -0,0 +1,55 @@ +#ifndef SPROUT_ALGORITHM_FIXED_REVERSE_COPY_HPP +#define SPROUT_ALGORITHM_FIXED_REVERSE_COPY_HPP + +#include +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type reverse_copy_impl( + Iterator first, + Iterator last, + Result const& result, + sprout::index_tuple, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::size_type size, + typename sprout::fixed_container_traits::size_type input_size + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{ + (Indexes >= offset && Indexes < offset + size && Indexes < offset + input_size + ? *(last - 1 - Indexes + offset) + : *(sprout::fixed_begin(result) + Indexes) + )... + }; + } + } // namespace detail + // + // reverse_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type reverse_copy( + Iterator first, + Iterator last, + Result const& result + ) + { + return sprout::fixed::detail::reverse_copy_impl( + first, + last, + result, typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), + sprout::fixed_begin_offset(result), + sprout::size(result), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_REVERSE_COPY_HPP diff --git a/sprout/algorithm/fixed/rotate.hpp b/sprout/algorithm/fixed/rotate.hpp new file mode 100644 index 00000000..34bff6ff --- /dev/null +++ b/sprout/algorithm/fixed/rotate.hpp @@ -0,0 +1,25 @@ +#ifndef SPROUT_ALGORITHM_FIXED_ROTATE_HPP +#define SPROUT_ALGORITHM_FIXED_ROTATE_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + // + // rotate + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type rotate( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle + ) + { + return sprout::fixed::rotate_copy(sprout::begin(cont), middle, sprout::end(cont), cont); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_ROTATE_HPP diff --git a/sprout/algorithm/fixed/rotate_copy.hpp b/sprout/algorithm/fixed/rotate_copy.hpp new file mode 100644 index 00000000..1799698b --- /dev/null +++ b/sprout/algorithm/fixed/rotate_copy.hpp @@ -0,0 +1,62 @@ +#ifndef SPROUT_ALGORITHM_FIXED_ROTATE_COPY_HPP +#define SPROUT_ALGORITHM_FIXED_ROTATE_COPY_HPP + +#include +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type rotate_copy_impl( + Iterator first, + Iterator middle, + Iterator last, + Result const& result, + sprout::index_tuple, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::size_type size, + typename sprout::fixed_container_traits::size_type input_size + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{ + (Indexes >= offset && Indexes < offset + size && Indexes < offset + input_size + ? (Indexes < offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(middle, last) + ? *(middle + Indexes - offset) + : *((first + Indexes - offset) - NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, middle)) + ) + : *(sprout::fixed_begin(result) + Indexes) + )... + }; + } + } // namespace detail + // + // rotate_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type rotate_copy( + Iterator first, + Iterator middle, + Iterator last, + Result const& result + ) + { + return sprout::fixed::detail::rotate_copy_impl( + first, + middle, + last, + result, + typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), + sprout::fixed_begin_offset(result), + sprout::size(result), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_ROTATE_COPY_HPP diff --git a/sprout/algorithm/fixed/set_difference.hpp b/sprout/algorithm/fixed/set_difference.hpp new file mode 100644 index 00000000..37d55de8 --- /dev/null +++ b/sprout/algorithm/fixed/set_difference.hpp @@ -0,0 +1,178 @@ +#ifndef SPROUT_ALGORITHM_FIXED_SET_DIFFERENCE_HPP +#define SPROUT_ALGORITHM_FIXED_SET_DIFFERENCE_HPP + +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_difference_impl_3( + Result const& result, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_difference_impl_3( + Result const& result, + Args const&... args + ) + { + return set_difference_impl_3(result, args..., *(sprout::fixed_begin(result) + sizeof...(Args))); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_difference_impl_2( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_difference_impl_2( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < offset + ? first1 != last1 + ? first2 != last2 + ? comp(*first1, *first2) + ? set_difference_impl_2(first1 + 1, last1, first2, last2, result, comp, offset, args..., *first1) + : comp(*first2, *first1) + ? set_difference_impl_2(first1, last1, first2 + 1, last2, result, comp, offset, args...) + : set_difference_impl_2(first1 + 1, last1, first2 + 1, last2, result, comp, offset, args...) + : set_difference_impl_2(first1 + 1, last1, first2, last2, result, comp, offset, args..., *first1) + : first2 != last2 + ? set_difference_impl_2(first1, last1, first2 + 1, last2, result, comp, offset, args...) + : set_difference_impl_3(result, args...) + : set_difference_impl_3(result, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_difference_impl_1( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_difference_impl_1( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < offset + ? set_difference_impl_1(first1, last1, first2, last2, result, comp, offset, args..., *(sprout::fixed_begin(result) + sizeof...(Args))) + : set_difference_impl_2(first1, last1, first2, last2, result, comp, offset + sprout::size(result), args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_difference_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return set_difference_impl_1(first1, last1, first2, last2, result, comp, sprout::fixed_begin_offset(result)); + } + } // namespace detail + // + // set_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_difference( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return sprout::fixed::detail::set_difference_impl( + first1, + last1, + first2, + last2, + result, + comp + ); + } + // + // set_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_difference( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result + ) + { + return sprout::fixed::detail::set_difference_impl( + first1, + last1, + first2, + last2, + result, + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::less::value_type>() + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_SET_DIFFERENCE_HPP diff --git a/sprout/algorithm/fixed/set_intersection.hpp b/sprout/algorithm/fixed/set_intersection.hpp new file mode 100644 index 00000000..47e055f3 --- /dev/null +++ b/sprout/algorithm/fixed/set_intersection.hpp @@ -0,0 +1,178 @@ +#ifndef SPROUT_ALGORITHM_FIXED_SET_INTERSECTION_HPP +#define SPROUT_ALGORITHM_FIXED_SET_INTERSECTION_HPP + +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_intersection_impl_3( + Result const& result, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_intersection_impl_3( + Result const& result, + Args const&... args + ) + { + return set_intersection_impl_3(result, args..., *(sprout::fixed_begin(result) + sizeof...(Args))); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_intersection_impl_2( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_intersection_impl_2( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < offset + ? first1 != last1 + ? first2 != last2 + ? comp(*first1, *first2) + ? set_intersection_impl_2(first1 + 1, last1, first2, last2, result, comp, offset, args...) + : comp(*first2, *first1) + ? set_intersection_impl_2(first1, last1, first2 + 1, last2, result, comp, offset, args...) + : set_intersection_impl_2(first1 + 1, last1, first2 + 1, last2, result, comp, offset, args..., *first1) + : set_intersection_impl_2(first1 + 1, last1, first2, last2, result, comp, offset, args...) + : first2 != last2 + ? set_intersection_impl_2(first1, last1, first2 + 1, last2, result, comp, offset, args...) + : set_intersection_impl_3(result, args...) + : set_intersection_impl_3(result, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_intersection_impl_1( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_intersection_impl_1( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < offset + ? set_intersection_impl_1(first1, last1, first2, last2, result, comp, offset, args..., *(sprout::fixed_begin(result) + sizeof...(Args))) + : set_intersection_impl_2(first1, last1, first2, last2, result, comp, offset + sprout::size(result), args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_intersection_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return set_intersection_impl_1(first1, last1, first2, last2, result, comp, sprout::fixed_begin_offset(result)); + } + } // namespace detail + // + // set_intersection + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_intersection( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return sprout::fixed::detail::set_intersection_impl( + first1, + last1, + first2, + last2, + result, + comp + ); + } + // + // set_intersection + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_intersection( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result + ) + { + return sprout::fixed::detail::set_intersection_impl( + first1, + last1, + first2, + last2, + result, + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::less::value_type>() + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_SET_INTERSECTION_HPP diff --git a/sprout/algorithm/fixed/set_symmetric_difference.hpp b/sprout/algorithm/fixed/set_symmetric_difference.hpp new file mode 100644 index 00000000..1b3e5cb9 --- /dev/null +++ b/sprout/algorithm/fixed/set_symmetric_difference.hpp @@ -0,0 +1,178 @@ +#ifndef SPROUT_ALGORITHM_FIXED_SET_SYMMETRIC_DIFFERENCE_HPP +#define SPROUT_ALGORITHM_FIXED_SET_SYMMETRIC_DIFFERENCE_HPP + +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_symmetric_difference_impl_3( + Result const& result, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_symmetric_difference_impl_3( + Result const& result, + Args const&... args + ) + { + return set_symmetric_difference_impl_3(result, args..., *(sprout::fixed_begin(result) + sizeof...(Args))); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_symmetric_difference_impl_2( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_symmetric_difference_impl_2( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < offset + ? first1 != last1 + ? first2 != last2 + ? comp(*first1, *first2) + ? set_symmetric_difference_impl_2(first1 + 1, last1, first2, last2, result, comp, offset, args..., *first1) + : comp(*first2, *first1) + ? set_symmetric_difference_impl_2(first1, last1, first2 + 1, last2, result, comp, offset, args..., *first2) + : set_symmetric_difference_impl_2(first1 + 1, last1, first2 + 1, last2, result, comp, offset, args...) + : set_symmetric_difference_impl_2(first1 + 1, last1, first2, last2, result, comp, offset, args..., *first1) + : first2 != last2 + ? set_symmetric_difference_impl_2(first1, last1, first2 + 1, last2, result, comp, offset, args..., *first2) + : set_symmetric_difference_impl_3(result, args...) + : set_symmetric_difference_impl_3(result, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_symmetric_difference_impl_1( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_symmetric_difference_impl_1( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < offset + ? set_symmetric_difference_impl_1(first1, last1, first2, last2, result, comp, offset, args..., *(sprout::fixed_begin(result) + sizeof...(Args))) + : set_symmetric_difference_impl_2(first1, last1, first2, last2, result, comp, offset + sprout::size(result), args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_symmetric_difference_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return set_symmetric_difference_impl_1(first1, last1, first2, last2, result, comp, sprout::fixed_begin_offset(result)); + } + } // namespace detail + // + // set_symmetric_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_symmetric_difference( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return sprout::fixed::detail::set_symmetric_difference_impl( + first1, + last1, + first2, + last2, + result, + comp + ); + } + // + // set_symmetric_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_symmetric_difference( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result + ) + { + return sprout::fixed::detail::set_symmetric_difference_impl( + first1, + last1, + first2, + last2, + result, + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::less::value_type>() + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_SET_SYMMETRIC_DIFFERENCE_HPP diff --git a/sprout/algorithm/fixed/set_union.hpp b/sprout/algorithm/fixed/set_union.hpp new file mode 100644 index 00000000..94fc522a --- /dev/null +++ b/sprout/algorithm/fixed/set_union.hpp @@ -0,0 +1,178 @@ +#ifndef SPROUT_ALGORITHM_FIXED_SET_UNION_HPP +#define SPROUT_ALGORITHM_FIXED_SET_UNION_HPP + +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_union_impl_3( + Result const& result, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_union_impl_3( + Result const& result, + Args const&... args + ) + { + return set_union_impl_3(result, args..., *(sprout::fixed_begin(result) + sizeof...(Args))); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_union_impl_2( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_union_impl_2( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < offset + ? first1 != last1 + ? first2 != last2 + ? comp(*first1, *first2) + ? set_union_impl_2(first1 + 1, last1, first2, last2, result, comp, offset, args..., *first1) + : comp(*first2, *first1) + ? set_union_impl_2(first1, last1, first2 + 1, last2, result, comp, offset, args..., *first2) + : set_union_impl_2(first1 + 1, last1, first2 + 1, last2, result, comp, offset, args..., *first1) + : set_union_impl_2(first1 + 1, last1, first2, last2, result, comp, offset, args..., *first1) + : first2 != last2 + ? set_union_impl_2(first1, last1, first2 + 1, last2, result, comp, offset, args..., *first2) + : set_union_impl_3(result, args...) + : set_union_impl_3(result, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_union_impl_1( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type set_union_impl_1( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < offset + ? set_union_impl_1(first1, last1, first2, last2, result, comp, offset, args..., *(sprout::fixed_begin(result) + sizeof...(Args))) + : set_union_impl_2(first1, last1, first2, last2, result, comp, offset + sprout::size(result), args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_union_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return set_union_impl_1(first1, last1, first2, last2, result, comp, sprout::fixed_begin_offset(result)); + } + } // namespace detail + // + // set_union + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_union( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return sprout::fixed::detail::set_union_impl( + first1, + last1, + first2, + last2, + result, + comp + ); + } + // + // set_union + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_union( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result + ) + { + return sprout::fixed::detail::set_union_impl( + first1, + last1, + first2, + last2, + result, + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::less::value_type>() + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_SET_UNION_HPP diff --git a/sprout/algorithm/fixed/sort.hpp b/sprout/algorithm/fixed/sort.hpp new file mode 100644 index 00000000..e751b394 --- /dev/null +++ b/sprout/algorithm/fixed/sort.hpp @@ -0,0 +1,191 @@ +#ifndef SPROUT_ALGORITHM_FIXED_SORT_HPP +#define SPROUT_ALGORITHM_FIXED_SORT_HPP + +#include +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::value_type const& sort_select_pivot( + Iterator origin, + typename sprout::fixed_container_traits::difference_type start, + typename sprout::fixed_container_traits::difference_type end + ) + { // pivot ‚ð‘I‚Ôi’†‰›‚Ì—v‘fj + return *(origin + (end + start) / 2); + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::difference_type sort_find_l( + Iterator origin, + Compare comp, + typename sprout::fixed_container_traits::difference_type l, + typename sprout::fixed_container_traits::value_type const& p + ) + { // left ‚ðŒ©‚Â‚¯‚é + return comp(*(origin + l), p) ? sort_find_l(origin, comp, l + 1, p) : l; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::difference_type sort_find_r( + Iterator origin, + Compare comp, + typename sprout::fixed_container_traits::difference_type r, + typename sprout::fixed_container_traits::value_type const& p + ) + { // right ‚ðŒ©‚Â‚¯‚é + return comp(p, *(origin + r)) ? sort_find_r(origin, comp, r - 1, p) : r; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type swap_lr( + Container const& cont, + typename sprout::fixed_container_traits::difference_type l, + typename sprout::fixed_container_traits::difference_type r + ); + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type sort_part_l( + Container const& cont, + typename sprout::fixed_container_traits::difference_type start, + Compare comp, + typename sprout::fixed_container_traits::difference_type l + ) + { // ¶‘¤‚ðƒ\[ƒg + return start < l - 1 ? sort_start(cont, start, l - 1, comp) : sprout::get_fixed_copy(cont); + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type sort_part_r( + Container const& cont, + typename sprout::fixed_container_traits::difference_type end, + Compare comp, + typename sprout::fixed_container_traits::difference_type r + ) + { // ‰E‘¤‚ðƒ\[ƒg + return r + 1 < end ? sort_start(cont, r + 1, end, comp) : sprout::get_fixed_copy(cont); + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type sort_part_lr( + Container const& cont, + typename sprout::fixed_container_traits::difference_type start, + typename sprout::fixed_container_traits::difference_type end, + Compare comp, + typename sprout::fixed_container_traits::difference_type l, + typename sprout::fixed_container_traits::difference_type r + ) + { // ¶‰E‚É•ª‚¯‚ă\[ƒg + return sort_part_r(sort_part_l(cont, start, comp, l), end, comp, r); + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type sort_next( + Container const& cont, + typename sprout::fixed_container_traits::difference_type start, + typename sprout::fixed_container_traits::difference_type end, + Compare comp, + typename sprout::fixed_container_traits::difference_type l, + typename sprout::fixed_container_traits::difference_type r, + typename sprout::fixed_container_traits::value_type const& p + ) + { // left ‚Æ right ”äŠr‚µ‚ÄA¶‰E‚É•ª‚¯‚ă\[ƒg‚·‚é‚©A‚Ü‚½‚̓Xƒƒbƒv‚µ‚Ä‚±‚͈̔͂̃\[ƒg‚𑱂¯‚é + return l >= r + ? sort_part_lr(cont, start, end, comp, l, r) + : sort_lr(sprout::fixed::swap_element(cont, sprout::fixed_begin(cont) + l, sprout::fixed_begin(cont) + r), start, end, comp, l + 1, r - 1, p) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type sort_lr( + Container const& cont, + typename sprout::fixed_container_traits::difference_type start, + typename sprout::fixed_container_traits::difference_type end, + Compare comp, + typename sprout::fixed_container_traits::difference_type l, + typename sprout::fixed_container_traits::difference_type r, + typename sprout::fixed_container_traits::value_type const& p + ) + { // left ‚Æ right ‚ðŒŸõ + return sort_next( + cont, + start, + end, + comp, + sort_find_l(sprout::fixed_begin(cont), comp, l, p), + sort_find_r(sprout::fixed_begin(cont), comp, r, p), + p + ); + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type sort_start( + Container const& cont, + typename sprout::fixed_container_traits::difference_type start, + typename sprout::fixed_container_traits::difference_type end, + Compare comp + ) + { // pivot ‚ð‘I‘ð‚µ‚Äƒ\[ƒg‚ðŠJŽn + return sort_lr(cont, start, end, comp, start, end, sort_select_pivot(sprout::fixed_begin(cont), start, end)); + } + } // namespace detail + // + // sort + // + template + SPROUT_CONSTEXPR inline typename std::enable_if< + (sprout::fixed_container_traits::fixed_size <= 1), + typename sprout::fixed_container_traits::fixed_container_type + >::type sort( + Container const& cont, + Compare comp + ) + { + return sprout::get_fixed_copy(cont); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + (sprout::fixed_container_traits::fixed_size > 1), + typename sprout::fixed_container_traits::fixed_container_type + >::type sort( + Container const& cont, + Compare comp + ) + { + return sprout::fixed::detail::sort_start( + cont, + sprout::fixed_begin_offset(cont), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::fixed_begin(cont), sprout::end(cont) - 1), + comp + ); + } + // + // sort + // + template + SPROUT_CONSTEXPR inline typename std::enable_if< + (sprout::fixed_container_traits::fixed_size <= 1), + typename sprout::fixed_container_traits::fixed_container_type + >::type sort( + Container const& cont + ) + { + return sprout::get_fixed_copy(cont); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + (sprout::fixed_container_traits::fixed_size > 1), + typename sprout::fixed_container_traits::fixed_container_type + >::type sort( + Container const& cont + ) + { + return sprout::fixed::detail::sort_start( + cont, + sprout::fixed_begin_offset(cont), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::fixed_begin(cont), sprout::end(cont) - 1), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::less::value_type>() + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_SORT_HPP diff --git a/sprout/algorithm/fixed/sort_heap.hpp b/sprout/algorithm/fixed/sort_heap.hpp new file mode 100644 index 00000000..d5dae764 --- /dev/null +++ b/sprout/algorithm/fixed/sort_heap.hpp @@ -0,0 +1,72 @@ +#ifndef SPROUT_ALGORITHM_FIXED_SORT_HEAP_HPP +#define SPROUT_ALGORITHM_FIXED_SORT_HEAP_HPP + +#include +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type sort_heap_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::difference_type size + ) + { + return size < 2 + ? sprout::get_fixed_copy(cont) + : sprout::fixed::detail::sort_heap_impl( + sprout::fixed::detail::pop_heap_impl( + sprout::fixed::swap_element(cont, sprout::begin(cont), sprout::begin(cont) + size - 1), + comp, + offset, + size - 1 + ), + comp, + offset, + size - 1 + ) + ; + } + } // namespace detail + // + // sort_heap + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type sort_heap( + Container const& cont, + Compare comp + ) + { + return sprout::fixed::detail::sort_heap_impl( + cont, + comp, + sprout::fixed_begin_offset(cont), + sprout::size(cont) + ); + } + // + // sort_heap + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type sort_heap( + Container const& cont + ) + { + return sprout::fixed::detail::sort_heap_impl( + cont, + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::less::value_type>(), + sprout::fixed_begin_offset(cont), + sprout::size(cont) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_SORT_HEAP_HPP diff --git a/sprout/algorithm/fixed/stable_partition.hpp b/sprout/algorithm/fixed/stable_partition.hpp new file mode 100644 index 00000000..5109b86e --- /dev/null +++ b/sprout/algorithm/fixed/stable_partition.hpp @@ -0,0 +1,25 @@ +#ifndef SPROUT_ALGORITHM_FIXED_STABLE_PARTITION_HPP +#define SPROUT_ALGORITHM_FIXED_STABLE_PARTITION_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + // + // stable_partition + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type stable_partition( + Container const& cont, + Predicate pred + ) + { + return sprout::fixed::stable_partition_copy(sprout::begin(cont), sprout::end(cont), cont, pred); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_STABLE_PARTITION_HPP diff --git a/sprout/algorithm/fixed/stable_partition_copy.hpp b/sprout/algorithm/fixed/stable_partition_copy.hpp new file mode 100644 index 00000000..b453436e --- /dev/null +++ b/sprout/algorithm/fixed/stable_partition_copy.hpp @@ -0,0 +1,170 @@ +#ifndef SPROUT_ALGORITHM_FIXED_STABLE_PARTITION_COPY_HPP +#define SPROUT_ALGORITHM_FIXED_STABLE_PARTITION_COPY_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_partition_copy_impl_4( + Result const& result, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_partition_copy_impl_4( + Result const& result, + Args const&... args + ) + { + return stable_partition_copy_impl_4(result, args..., *(sprout::fixed_begin(result) + sizeof...(Args))); + } + + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_partition_copy_impl_3( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_partition_copy_impl_3( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return first != last && sizeof...(Args) < offset + ? !pred(*first) + ? stable_partition_copy_impl_3(first + 1, last, result, pred, offset, args..., *first) + : stable_partition_copy_impl_3(first + 1, last, result, pred, offset, args...) + : stable_partition_copy_impl_4(result, args...) + ; + } + + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_partition_copy_impl_2( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Iterator origin, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_partition_copy_impl_2( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Iterator origin, + Args const&... args + ) + { + return first != last && sizeof...(Args) < offset + ? pred(*first) + ? stable_partition_copy_impl_2(first + 1, last, result, pred, offset, origin, args..., *first) + : stable_partition_copy_impl_2(first + 1, last, result, pred, offset, origin, args...) + : stable_partition_copy_impl_3(origin, last, result, pred, offset, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_partition_copy_impl_1( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Iterator origin, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_partition_copy_impl_1( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Iterator origin, + Args const&... args + ) + { + return sizeof...(Args) < offset + ? stable_partition_copy_impl_1(first, last, result, pred, offset, origin, args..., *(sprout::fixed_begin(result) + sizeof...(Args))) + : stable_partition_copy_impl_2(first, last, result, pred, offset + sprout::size(result), origin, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type stable_partition_copy_impl( + Iterator first, + Iterator last, + Result const& result, + Predicate pred + ) + { + return stable_partition_copy_impl_1(first, last, result, pred, sprout::fixed_begin_offset(result), first); + } + } // namespace detail + // + // stable_partition_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type stable_partition_copy( + Iterator first, + Iterator last, + Result const& result, + Predicate pred + ) + { + return sprout::fixed::detail::stable_partition_copy_impl(first, last, result, pred); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_STABLE_PARTITION_COPY_HPP diff --git a/sprout/algorithm/fixed/stable_sort.hpp b/sprout/algorithm/fixed/stable_sort.hpp new file mode 100644 index 00000000..6ccbc36c --- /dev/null +++ b/sprout/algorithm/fixed/stable_sort.hpp @@ -0,0 +1,259 @@ +#ifndef SPROUT_ALGORITHM_FIXED_STABLE_SORT_HPP +#define SPROUT_ALGORITHM_FIXED_STABLE_SORT_HPP + +#include +#include +#include +#include +#include +#include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sizeof...(Indexes) != 0 && sizeof...(SortedIndexes) != 0, + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_sort_impl_4( + Container const& cont, + Compare comp, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple + ); + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type stable_sort_impl_finish( + Container const& cont, + sprout::index_tuple + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{(*(sprout::fixed_begin(cont) + Indexes))...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sizeof...(Indexes) == 0 && sizeof...(SortedIndexes) == 0, + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_sort_impl_4( + Container const& cont, + Compare comp, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple + ) + { + return comp(*(sprout::fixed_begin(cont) + I1), *(sprout::fixed_begin(cont) + I2)) + ? stable_sort_impl_finish(cont, sprout::index_tuple()) + : stable_sort_impl_finish(cont, sprout::index_tuple()) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sizeof...(Indexes) == 0 && sizeof...(SortedIndexes) != 0, + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_sort_impl_4( + Container const& cont, + Compare comp, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple + ) + { + return comp(*(sprout::fixed_begin(cont) + I1), *(sprout::fixed_begin(cont) + I2)) + ? stable_sort_impl_finish(cont, sprout::index_tuple()) + : stable_sort_impl_4(cont, comp, sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple()) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sizeof...(Indexes) != 0 && sizeof...(SortedIndexes) == 0, + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_sort_impl_4( + Container const& cont, + Compare comp, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple + ) + { + return comp(*(sprout::fixed_begin(cont) + I1), *(sprout::fixed_begin(cont) + I2)) + ? stable_sort_impl_4(cont, comp, sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple<>(), sprout::index_tuple(), sprout::index_tuple()) + : stable_sort_impl_4(cont, comp, sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple<>(), sprout::index_tuple(), sprout::index_tuple()) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sizeof...(Indexes) != 0 && sizeof...(SortedIndexes) != 0, + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_sort_impl_4( + Container const& cont, + Compare comp, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple + ) + { + return comp(*(sprout::fixed_begin(cont) + I1), *(sprout::fixed_begin(cont) + I2)) + ? stable_sort_impl_4(cont, comp, sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple<>(), sprout::index_tuple(), sprout::index_tuple()) + : stable_sort_impl_4(cont, comp, sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple()) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type stable_sort_impl_3( + Container const& cont, + Compare comp, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple + ) + { + return stable_sort_impl_4(cont, comp, sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple<>(), sprout::index_tuple(), sprout::index_tuple()); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + (sizeof...(Indexes) <= 1), + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_sort_impl_2( + Container const& cont, + Compare comp, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple + ) + { + return stable_sort_impl_finish(cont, sprout::index_tuple()); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + (sizeof...(Indexes) > 1), + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_sort_impl_2( + Container const& cont, + Compare comp, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple + ) + { + return stable_sort_impl_3(cont, comp, sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple()); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sizeof...(Indexes) == 0, + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_sort_impl_1( + Container const& cont, + Compare comp, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple + ) + { + return I < sprout::fixed_begin_offset(cont) + ? stable_sort_impl_2(cont, comp, sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple()) + : I >= sprout::fixed_end_offset(cont) + ? stable_sort_impl_2(cont, comp, sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple()) + : stable_sort_impl_2(cont, comp, sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple()) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sizeof...(Indexes) != 0, + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_sort_impl_1( + Container const& cont, + Compare comp, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple, + sprout::index_tuple + ) + { + return I < sprout::fixed_begin_offset(cont) + ? stable_sort_impl_1(cont, comp, sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple()) + : I >= sprout::fixed_end_offset(cont) + ? stable_sort_impl_1(cont, comp, sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple()) + : stable_sort_impl_1(cont, comp, sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple(), sprout::index_tuple()) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type stable_sort_impl( + Container const& cont, + Compare comp, + sprout::index_tuple + ) + { + return stable_sort_impl_1(cont, comp, sprout::index_tuple(), sprout::index_tuple<>(), sprout::index_tuple<>(), sprout::index_tuple<>()); + } + } // namespace detail + // + // stable_sort + // + template + SPROUT_CONSTEXPR inline typename std::enable_if< + (sprout::fixed_container_traits::fixed_size <= 1), + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_sort( + Container const& cont, + Compare comp + ) + { + return sprout::get_fixed_copy(cont); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + (sprout::fixed_container_traits::fixed_size > 1), + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_sort( + Container const& cont, + Compare comp + ) + { + return sprout::fixed::detail::stable_sort_impl( + cont, + comp, + typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type() + ); + } + // + // stable_sort + // + template + SPROUT_CONSTEXPR inline typename std::enable_if< + (sprout::fixed_container_traits::fixed_size <= 1), + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_sort( + Container const& cont + ) + { + return sprout::get_fixed_copy(cont); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + (sprout::fixed_container_traits::fixed_size > 1), + typename sprout::fixed_container_traits::fixed_container_type + >::type stable_sort( + Container const& cont + ) + { + return sprout::fixed::detail::stable_sort_impl( + cont, + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::less::value_type>(), + typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type() + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_STABLE_SORT_HPP diff --git a/sprout/algorithm/fixed/swap_element.hpp b/sprout/algorithm/fixed/swap_element.hpp new file mode 100644 index 00000000..1cfabae4 --- /dev/null +++ b/sprout/algorithm/fixed/swap_element.hpp @@ -0,0 +1,26 @@ +#ifndef SPROUT_ALGORITHM_FIXED_SWAP_ELEMENT_HPP +#define SPROUT_ALGORITHM_FIXED_SWAP_ELEMENT_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + // + // swap_element + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type swap_element( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator pos1, + typename sprout::fixed_container_traits::const_iterator pos2 + ) + { + return sprout::fixed::swap_element_copy(sprout::begin(cont), sprout::end(cont), cont, pos1, pos2); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_SWAP_ELEMENT_HPP diff --git a/sprout/algorithm/fixed/swap_element_copy.hpp b/sprout/algorithm/fixed/swap_element_copy.hpp new file mode 100644 index 00000000..b5cf3a9f --- /dev/null +++ b/sprout/algorithm/fixed/swap_element_copy.hpp @@ -0,0 +1,66 @@ +#ifndef SPROUT_ALGORITHM_FIXED_SWAP_ELEMENT_COPY_HPP +#define SPROUT_ALGORITHM_FIXED_SWAP_ELEMENT_COPY_HPP + +#include +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type swap_element_copy_impl( + Iterator first, + Iterator last, + Result const& result, + sprout::index_tuple, + Iterator pos1, + Iterator pos2, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::size_type size, + typename sprout::fixed_container_traits::size_type input_size + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{ + (Indexes >= offset && Indexes < offset + size && Indexes < offset + input_size + ? first + Indexes - offset == pos1 + ? *pos2 + : first + Indexes - offset == pos2 + ? *pos1 + : *(first + Indexes - offset) + : *(sprout::fixed_begin(result) + Indexes) + )... + }; + } + } // namespace detail + // + // swap_element_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type swap_element_copy( + Iterator first, + Iterator last, + Result const& result, + Iterator pos1, + Iterator pos2 + ) + { + return sprout::fixed::detail::swap_element_copy_impl( + first, + last, + result, + typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), + pos1, + pos2, + sprout::fixed_begin_offset(result), + sprout::size(result), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_SWAP_ELEMENT_COPY_HPP diff --git a/sprout/algorithm/fixed/transform.hpp b/sprout/algorithm/fixed/transform.hpp new file mode 100644 index 00000000..4a9f4388 --- /dev/null +++ b/sprout/algorithm/fixed/transform.hpp @@ -0,0 +1,106 @@ +#ifndef SPROUT_ALGORITHM_FIXED_TRANSFORM_HPP +#define SPROUT_ALGORITHM_FIXED_TRANSFORM_HPP + +#include +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type transform_impl( + Iterator first, + Iterator last, + Result const& result, + sprout::index_tuple, + UnaryOperation op, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::size_type size, + typename sprout::fixed_container_traits::size_type input_size + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{ + (Indexes >= offset && Indexes < offset + size && Indexes < offset + input_size + ? op(*(first + Indexes - offset)) + : *(sprout::fixed_begin(result) + Indexes) + )... + }; + } + } // namespace detail + // + // transform + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type transform( + Iterator first, + Iterator last, + Result const& result, + UnaryOperation op + ) + { + return sprout::fixed::detail::transform_impl( + first, + last, + result, + typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), + op, + sprout::fixed_begin_offset(result), + sprout::size(result), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last) + ); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type transform_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Result const& result, + sprout::index_tuple, + BinaryOperation op, + typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::size_type size, + typename sprout::fixed_container_traits::size_type input_size + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{ + (Indexes >= offset && Indexes < offset + size && Indexes < offset + input_size + ? op(*(first1 + Indexes - offset), *(first2 + Indexes - offset)) + : *(sprout::fixed_begin(result) + Indexes) + )... + }; + } + } // namespace detail + // + // transform + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type transform( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Result const& result, + BinaryOperation op + ) + { + return sprout::fixed::detail::transform_impl( + first1, + last1, + first2, + result, + typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), + op, + sprout::fixed_begin_offset(result), + sprout::size(result), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first1, last1) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_TRANSFORM_HPP diff --git a/sprout/algorithm/fixed/unique.hpp b/sprout/algorithm/fixed/unique.hpp new file mode 100644 index 00000000..60248ac4 --- /dev/null +++ b/sprout/algorithm/fixed/unique.hpp @@ -0,0 +1,36 @@ +#ifndef SPROUT_ALGORITHM_FIXED_UNIQUE_HPP +#define SPROUT_ALGORITHM_FIXED_UNIQUE_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + // + // unique + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type unique( + Container const& cont + ) + { + return sprout::fixed::unique_copy(sprout::begin(cont), sprout::end(cont), cont); + } + + // + // unique + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type unique( + Container const& cont, + BinaryPredicate pred + ) + { + return sprout::fixed::unique_copy(sprout::begin(cont), sprout::end(cont), cont, pred); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_UNIQUE_HPP diff --git a/sprout/algorithm/fixed/unique_copy.hpp b/sprout/algorithm/fixed/unique_copy.hpp new file mode 100644 index 00000000..3d6daa6e --- /dev/null +++ b/sprout/algorithm/fixed/unique_copy.hpp @@ -0,0 +1,221 @@ +#ifndef SPROUT_ALGORITHM_FIXED_UNIQUE_COPY_HPP +#define SPROUT_ALGORITHM_FIXED_UNIQUE_COPY_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type unique_copy_impl_3( + Result const& result, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type unique_copy_impl_3( + Result const& result, + Args const&... args + ) + { + return unique_copy_impl_3(result, args..., *(sprout::fixed_begin(result) + sizeof...(Args))); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args) + 1, + typename sprout::fixed_container_traits::fixed_container_type + >::type unique_copy_impl_2( + Iterator first, + Iterator last, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset, + Head const& head, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args..., head}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args) + 1, + typename sprout::fixed_container_traits::fixed_container_type + >::type unique_copy_impl_2( + Iterator first, + Iterator last, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset, + Head const& head, + Args const&... args + ) + { + return first != last && sizeof...(Args) + 1 < offset + ? !(head == *first) + ? unique_copy_impl_2(first + 1, last, result, offset, *first, args..., head) + : unique_copy_impl_2(first + 1, last, result, offset, head, args...) + : unique_copy_impl_3(result, args..., head) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type unique_copy_impl_1( + Iterator first, + Iterator last, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type unique_copy_impl_1( + Iterator first, + Iterator last, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < offset + ? unique_copy_impl_1(first, last, result, offset, args..., *(sprout::fixed_begin(result) + sizeof...(Args))) + : unique_copy_impl_2(first + 1, last, result, offset + sprout::size(result), *first, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type unique_copy_impl( + Iterator first, + Iterator last, + Result const& result + ) + { + return unique_copy_impl_1(first, last, result, sprout::fixed_begin_offset(result)); + } + } // namespace detail + // + // unique_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type unique_copy( + Iterator first, + Iterator last, + Result const& result + ) + { + return sprout::fixed::detail::unique_copy_impl(first, last, result); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args) + 1, + typename sprout::fixed_container_traits::fixed_container_type + >::type unique_copy_impl_2( + Iterator first, + Iterator last, + Result const& result, + BinaryPredicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Head const& head, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args..., head}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args) + 1, + typename sprout::fixed_container_traits::fixed_container_type + >::type unique_copy_impl_2( + Iterator first, + Iterator last, + Result const& result, + BinaryPredicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Head const& head, + Args const&... args + ) + { + return first != last && sizeof...(Args) + 1 < offset + ? !pred(head, *first) + ? unique_copy_impl_2(first + 1, last, result, pred, offset, *first, args..., head) + : unique_copy_impl_2(first + 1, last, result, pred, offset, head, args...) + : unique_copy_impl_3(result, args..., head) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type unique_copy_impl_1( + Iterator first, + Iterator last, + Result const& result, + BinaryPredicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return typename sprout::fixed_container_traits::fixed_container_type{args...}; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed_container_traits::fixed_container_type + >::type unique_copy_impl_1( + Iterator first, + Iterator last, + Result const& result, + BinaryPredicate pred, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < offset + ? unique_copy_impl_1(first, last, result, pred, offset, args..., *(sprout::fixed_begin(result) + sizeof...(Args))) + : unique_copy_impl_2(first + 1, last, result, pred, offset + sprout::size(result), *first, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type unique_copy_impl( + Iterator first, + Iterator last, + Result const& result, + BinaryPredicate pred + ) + { + return unique_copy_impl_1(first, last, result, pred, sprout::fixed_begin_offset(result)); + } + } // namespace detail + // + // unique_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type unique_copy( + Iterator first, + Iterator last, + Result const& result, + BinaryPredicate pred + ) + { + return sprout::fixed::detail::unique_copy_impl(first, last, result, pred); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_FIXED_UNIQUE_COPY_HPP diff --git a/sprout/algorithm/generate.hpp b/sprout/algorithm/generate.hpp new file mode 100644 index 00000000..83484320 --- /dev/null +++ b/sprout/algorithm/generate.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_GENERATE_HPP +#define SPROUT_ALGORITHM_GENERATE_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_GENERATE_HPP diff --git a/sprout/algorithm/generate_n.hpp b/sprout/algorithm/generate_n.hpp new file mode 100644 index 00000000..34a6f0fc --- /dev/null +++ b/sprout/algorithm/generate_n.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_GENERATE_N_HPP +#define SPROUT_ALGORITHM_GENERATE_N_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_GENERATE_N_HPP diff --git a/sprout/algorithm/infit.hpp b/sprout/algorithm/infit.hpp new file mode 100644 index 00000000..d7467e21 --- /dev/null +++ b/sprout/algorithm/infit.hpp @@ -0,0 +1,50 @@ +#ifndef SPROUT_ALGORITHM_INFIT_HPP +#define SPROUT_ALGORITHM_INFIT_HPP + +#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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_HPP diff --git a/sprout/algorithm/infit/copy.hpp b/sprout/algorithm/infit/copy.hpp new file mode 100644 index 00000000..5df1a370 --- /dev/null +++ b/sprout/algorithm/infit/copy.hpp @@ -0,0 +1,45 @@ +#ifndef SPROUT_ALGORITHM_INFIT_COPY_HPP +#define SPROUT_ALGORITHM_INFIT_COPY_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy_impl( + Iterator first, + Iterator last, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::copy(first, last, result), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last), sprout::size(result)) + ); + } + } // namespace detail + // + // copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy( + Iterator first, + Iterator last, + Result const& result + ) + { + return sprout::infit::detail::copy_impl(first, last, result, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_COPY_HPP diff --git a/sprout/algorithm/infit/copy_backward.hpp b/sprout/algorithm/infit/copy_backward.hpp new file mode 100644 index 00000000..a57ffb1f --- /dev/null +++ b/sprout/algorithm/infit/copy_backward.hpp @@ -0,0 +1,45 @@ +#ifndef SPROUT_ALGORITHM_INFIT_COPY_BACKWARD_HPP +#define SPROUT_ALGORITHM_INFIT_COPY_BACKWARD_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy_backward_impl( + Iterator first, + Iterator last, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::copy_backward(first, last, result), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last), sprout::size(result)) + ); + } + } // namespace detail + // + // copy_backward + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy_backward( + Iterator first, + Iterator last, + Result const& result + ) + { + return sprout::infit::detail::copy_backward_impl(first, last, result, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_COPY_BACKWARD_HPP diff --git a/sprout/algorithm/infit/copy_if.hpp b/sprout/algorithm/infit/copy_if.hpp new file mode 100644 index 00000000..968786b7 --- /dev/null +++ b/sprout/algorithm/infit/copy_if.hpp @@ -0,0 +1,46 @@ +#ifndef SPROUT_ALGORITHM_INFIT_COPY_IF_HPP +#define SPROUT_ALGORITHM_INFIT_COPY_IF_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy_if_impl( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::copy_if(first, last, result, pred), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::count_if(first, last, pred), sprout::size(result)) + ); + } + } // namespace detail + // + // copy_if + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy_if( + Iterator first, + Iterator last, + Result const& result, + Predicate pred + ) + { + return sprout::infit::detail::copy_if_impl(first, last, result, pred, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_COPY_IF_HPP diff --git a/sprout/algorithm/infit/copy_n.hpp b/sprout/algorithm/infit/copy_n.hpp new file mode 100644 index 00000000..5295967a --- /dev/null +++ b/sprout/algorithm/infit/copy_n.hpp @@ -0,0 +1,44 @@ +#ifndef SPROUT_ALGORITHM_INFIT_COPY_N_HPP +#define SPROUT_ALGORITHM_INFIT_COPY_N_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy_n_impl( + Iterator first, + Size n, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::copy_n(first, n, result), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(n, sprout::size(result)) + ); + } + } // namespace detail + // + // copy_n + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy_n( + Iterator first, + Size n, + Result const& result + ) + { + return sprout::infit::detail::copy_n_impl(first, n, result, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_COPY_N_HPP diff --git a/sprout/algorithm/infit/fill.hpp b/sprout/algorithm/infit/fill.hpp new file mode 100644 index 00000000..c5ee1234 --- /dev/null +++ b/sprout/algorithm/infit/fill.hpp @@ -0,0 +1,41 @@ +#ifndef SPROUT_ALGORITHM_INFIT_FILL_HPP +#define SPROUT_ALGORITHM_INFIT_FILL_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> fill_impl( + Container const& cont, + T const& value, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::fill(cont, value), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // fill + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> fill( + Container const& cont, + T const& value + ) + { + return sprout::infit::detail::fill_impl(cont, value, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_FILL_HPP diff --git a/sprout/algorithm/infit/fill_n.hpp b/sprout/algorithm/infit/fill_n.hpp new file mode 100644 index 00000000..796cfc37 --- /dev/null +++ b/sprout/algorithm/infit/fill_n.hpp @@ -0,0 +1,44 @@ +#ifndef SPROUT_ALGORITHM_INFIT_FILL_N_HPP +#define SPROUT_ALGORITHM_INFIT_FILL_N_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> fill_n_impl( + Container const& cont, + Size n, + T const& value, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::fill_n(cont, n, value), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(n, sprout::size(cont)) + ); + } + } // namespace detail + // + // fill_n + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> fill_n( + Container const& cont, + Size n, + T const& value + ) + { + return sprout::infit::detail::fill_n_impl(cont, n, value, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_FILL_N_HPP diff --git a/sprout/algorithm/infit/generate.hpp b/sprout/algorithm/infit/generate.hpp new file mode 100644 index 00000000..8a8668d9 --- /dev/null +++ b/sprout/algorithm/infit/generate.hpp @@ -0,0 +1,43 @@ +#ifndef SPROUT_ALGORITHM_INFIT_GENERATE_HPP +#define SPROUT_ALGORITHM_INFIT_GENERATE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> generate_impl( + Container const& cont, + Generator gen, + typename sprout::fixed_container_traits::difference_type offset, + Inits const&... inits + ) + { + return sprout::sub_copy( + sprout::fixed::generate(cont, gen, inits...), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // generate + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> generate( + Container const& cont, + Generator gen, + Inits const&... inits + ) + { + return sprout::infit::detail::generate_impl(cont, gen, sprout::fixed_begin_offset(cont), inits...); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_GENERATE_HPP diff --git a/sprout/algorithm/infit/generate_n.hpp b/sprout/algorithm/infit/generate_n.hpp new file mode 100644 index 00000000..e9be8640 --- /dev/null +++ b/sprout/algorithm/infit/generate_n.hpp @@ -0,0 +1,46 @@ +#ifndef SPROUT_ALGORITHM_INFIT_GENERATE_N_HPP +#define SPROUT_ALGORITHM_INFIT_GENERATE_N_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> generate_n_impl( + Container const& cont, + Size n, + Generator gen, + typename sprout::fixed_container_traits::difference_type offset, + Inits const&... inits + ) + { + return sprout::sub_copy( + sprout::fixed::generate_n(cont, n, gen, inits...), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(n, sprout::size(cont)) + ); + } + } // namespace detail + // + // generate_n + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> generate_n( + Container const& cont, + Size n, + Generator gen, + Inits const&... inits + ) + { + return sprout::infit::detail::generate_n_impl(cont, n, gen, sprout::fixed_begin_offset(cont), inits...); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_GENERATE_N_HPP diff --git a/sprout/algorithm/infit/inplace_merge.hpp b/sprout/algorithm/infit/inplace_merge.hpp new file mode 100644 index 00000000..c9970d18 --- /dev/null +++ b/sprout/algorithm/infit/inplace_merge.hpp @@ -0,0 +1,70 @@ +#ifndef SPROUT_ALGORITHM_INFIT_INPLACE_MERGE_HPP +#define SPROUT_ALGORITHM_INFIT_INPLACE_MERGE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> inplace_merge_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::inplace_merge(cont, middle, comp), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // inplace_merge + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> inplace_merge( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + Compare comp + ) + { + return sprout::infit::detail::inplace_merge_impl(cont, middle, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> inplace_merge_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::inplace_merge(cont, middle), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // inplace_merge + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> inplace_merge( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle + ) + { + return sprout::infit::detail::inplace_merge_impl(cont, middle, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_INPLACE_MERGE_HPP diff --git a/sprout/algorithm/infit/make_heap.hpp b/sprout/algorithm/infit/make_heap.hpp new file mode 100644 index 00000000..f89f86d6 --- /dev/null +++ b/sprout/algorithm/infit/make_heap.hpp @@ -0,0 +1,66 @@ +#ifndef SPROUT_ALGORITHM_INFIT_MAKE_HEAP_HPP +#define SPROUT_ALGORITHM_INFIT_MAKE_HEAP_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> make_heap_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::make_heap(cont, comp), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // make_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> make_heap( + Container const& cont, + Compare comp + ) + { + return sprout::infit::detail::make_heap_impl(cont, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> make_heap_impl( + Container const& cont, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::make_heap(cont), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // make_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> make_heap( + Container const& cont + ) + { + return sprout::infit::detail::make_heap_impl(cont, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_MAKE_HEAP_HPP diff --git a/sprout/algorithm/infit/make_partial_heap.hpp b/sprout/algorithm/infit/make_partial_heap.hpp new file mode 100644 index 00000000..187eca20 --- /dev/null +++ b/sprout/algorithm/infit/make_partial_heap.hpp @@ -0,0 +1,71 @@ +#ifndef SPROUT_ALGORITHM_INFIT_MAKE_PARTIAL_HEAP_HPP +#define SPROUT_ALGORITHM_INFIT_MAKE_PARTIAL_HEAP_HPP + +#include +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> make_partial_heap_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::make_partial_heap(cont, middle, comp), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::begin(cont), middle) + ); + } + } // namespace detail + // + // make_partial_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> make_partial_heap( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + Compare comp + ) + { + return sprout::infit::detail::make_partial_heap_impl(cont, middle, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> make_partial_heap_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::make_partial_heap(cont, middle), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::begin(cont), middle) + ); + } + } // namespace detail + // + // make_partial_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> make_partial_heap( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle + ) + { + return sprout::infit::detail::make_partial_heap_impl(cont, middle, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_MAKE_PARTIAL_HEAP_HPP diff --git a/sprout/algorithm/infit/merge.hpp b/sprout/algorithm/infit/merge.hpp new file mode 100644 index 00000000..370ae659 --- /dev/null +++ b/sprout/algorithm/infit/merge.hpp @@ -0,0 +1,90 @@ +#ifndef SPROUT_ALGORITHM_INFIT_MERGE_HPP +#define SPROUT_ALGORITHM_INFIT_MERGE_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> merge_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::merge(first1, last1, first2, last2, result, comp), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min( + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first1, last1) + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first2, last2), + sprout::size(result) + ) + ); + } + } // namespace detail + // + // merge + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> merge( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return sprout::infit::detail::merge_impl(first1, last1, first2, last2, result, comp, sprout::fixed_begin_offset(result)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> merge_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::merge(first1, last1, first2, last2, result), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min( + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first1, last1) + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first2, last2), + sprout::size(result) + ) + ); + } + } // namespace detail + // + // merge + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> merge( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result + ) + { + return sprout::infit::detail::merge_impl(first1, last1, first2, last2, result, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_MERGE_HPP diff --git a/sprout/algorithm/infit/nth_element.hpp b/sprout/algorithm/infit/nth_element.hpp new file mode 100644 index 00000000..34070a94 --- /dev/null +++ b/sprout/algorithm/infit/nth_element.hpp @@ -0,0 +1,71 @@ +#ifndef SPROUT_ALGORITHM_INFIT_NTH_ELEMENT_HPP +#define SPROUT_ALGORITHM_INFIT_NTH_ELEMENT_HPP + +#include +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> nth_element_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator nth, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::nth_element(cont, nth, comp), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::begin(cont), nth) + 1 + ); + } + } // namespace detail + // + // nth_element + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> nth_element( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator nth, + Compare comp + ) + { + return sprout::infit::detail::nth_element_impl(cont, nth, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> nth_element_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator nth, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::nth_element(cont, nth), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::begin(cont), nth) + 1 + ); + } + } // namespace detail + // + // nth_element + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> nth_element( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator nth + ) + { + return sprout::infit::detail::nth_element_impl(cont, nth, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_NTH_ELEMENT_HPP diff --git a/sprout/algorithm/infit/partial_sort.hpp b/sprout/algorithm/infit/partial_sort.hpp new file mode 100644 index 00000000..0601c5b2 --- /dev/null +++ b/sprout/algorithm/infit/partial_sort.hpp @@ -0,0 +1,71 @@ +#ifndef SPROUT_ALGORITHM_INFIT_PARTIAL_SORT_HPP +#define SPROUT_ALGORITHM_INFIT_PARTIAL_SORT_HPP + +#include +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> partial_sort_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::partial_sort(cont, middle, comp), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::begin(cont), middle) + ); + } + } // namespace detail + // + // partial_sort + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> partial_sort( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + Compare comp + ) + { + return sprout::infit::detail::partial_sort_impl(cont, middle, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> partial_sort_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::partial_sort(cont, middle), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::begin(cont), middle) + ); + } + } // namespace detail + // + // partial_sort + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> partial_sort( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle + ) + { + return sprout::infit::detail::partial_sort_impl(cont, middle, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_PARTIAL_SORT_HPP diff --git a/sprout/algorithm/infit/partition.hpp b/sprout/algorithm/infit/partition.hpp new file mode 100644 index 00000000..65bb181b --- /dev/null +++ b/sprout/algorithm/infit/partition.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_ALGORITHM_INFIT_PARTITION_HPP +#define SPROUT_ALGORITHM_INFIT_PARTITION_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> partition_impl( + Container const& cont, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::partition(cont, pred), + offset, + offset + sprout::size(cont) - NS_SSCRISK_CEL_OR_SPROUT_DETAIL::count_if(sprout::begin(cont), sprout::end(cont), pred) + ); + } + } // namespace detail + // + // partition + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> partition( + Container const& cont, + Predicate pred + ) + { + return sprout::infit::detail::partition_impl(cont, pred, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_PARTITION_HPP diff --git a/sprout/algorithm/infit/partition_copy.hpp b/sprout/algorithm/infit/partition_copy.hpp new file mode 100644 index 00000000..a7bc2eb2 --- /dev/null +++ b/sprout/algorithm/infit/partition_copy.hpp @@ -0,0 +1,46 @@ +#ifndef SPROUT_ALGORITHM_INFIT_PARTITION_COPY_HPP +#define SPROUT_ALGORITHM_INFIT_PARTITION_COPY_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> partition_copy_impl( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::partition_copy(first, last, result, pred), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::count_if(first, last, pred), sprout::size(result)) + ); + } + } // namespace detail + // + // partition_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> partition_copy( + Iterator first, + Iterator last, + Result const& result, + Predicate pred + ) + { + return sprout::infit::detail::partition_copy_impl(first, last, result, pred, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_PARTITION_COPY_HPP diff --git a/sprout/algorithm/infit/pop_heap.hpp b/sprout/algorithm/infit/pop_heap.hpp new file mode 100644 index 00000000..1de1905f --- /dev/null +++ b/sprout/algorithm/infit/pop_heap.hpp @@ -0,0 +1,66 @@ +#ifndef SPROUT_ALGORITHM_INFIT_POP_HEAP_HPP +#define SPROUT_ALGORITHM_INFIT_POP_HEAP_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> pop_heap_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::pop_heap(cont, comp), + offset, + offset + sprout::size(cont) - 1 + ); + } + } // namespace detail + // + // pop_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> pop_heap( + Container const& cont, + Compare comp + ) + { + return sprout::infit::detail::pop_heap_impl(cont, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> pop_heap_impl( + Container const& cont, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::pop_heap(cont), + offset, + offset + sprout::size(cont) - 1 + ); + } + } // namespace detail + // + // pop_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> pop_heap( + Container const& cont + ) + { + return sprout::infit::detail::pop_heap_impl(cont, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_POP_HEAP_HPP diff --git a/sprout/algorithm/infit/push_heap.hpp b/sprout/algorithm/infit/push_heap.hpp new file mode 100644 index 00000000..58c7f181 --- /dev/null +++ b/sprout/algorithm/infit/push_heap.hpp @@ -0,0 +1,66 @@ +#ifndef SPROUT_ALGORITHM_INFIT_PUSH_HEAP_HPP +#define SPROUT_ALGORITHM_INFIT_PUSH_HEAP_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> push_heap_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::push_heap(cont, comp), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // push_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> push_heap( + Container const& cont, + Compare comp + ) + { + return sprout::infit::detail::push_heap_impl(cont, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> push_heap_impl( + Container const& cont, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::push_heap(cont), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // push_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> push_heap( + Container const& cont + ) + { + return sprout::infit::detail::push_heap_impl(cont, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_PUSH_HEAP_HPP diff --git a/sprout/algorithm/infit/remove.hpp b/sprout/algorithm/infit/remove.hpp new file mode 100644 index 00000000..82bae6d4 --- /dev/null +++ b/sprout/algorithm/infit/remove.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_ALGORITHM_INFIT_REMOVE_HPP +#define SPROUT_ALGORITHM_INFIT_REMOVE_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove_impl( + Container const& cont, + T const& value, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::remove(cont, value), + offset, + offset + sprout::size(cont) - NS_SSCRISK_CEL_OR_SPROUT_DETAIL::count(sprout::begin(cont), sprout::end(cont), value) + ); + } + } // namespace detail + // + // remove + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove( + Container const& cont, + T const& value + ) + { + return sprout::infit::detail::remove_impl(cont, value, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_REMOVE_HPP diff --git a/sprout/algorithm/infit/remove_copy.hpp b/sprout/algorithm/infit/remove_copy.hpp new file mode 100644 index 00000000..40fea2f6 --- /dev/null +++ b/sprout/algorithm/infit/remove_copy.hpp @@ -0,0 +1,47 @@ +#ifndef SPROUT_ALGORITHM_INFIT_REMOVE_COPY_HPP +#define SPROUT_ALGORITHM_INFIT_REMOVE_COPY_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove_copy_impl( + Iterator first, + Iterator last, + Result const& result, + T const& value, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::remove_copy(first, last, result, value), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last) - NS_SSCRISK_CEL_OR_SPROUT_DETAIL::count(first, last, value), sprout::size(result)) + ); + } + } // namespace detail + // + // remove_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove_copy( + Iterator first, + Iterator last, + Result const& result, + T const& value + ) + { + return sprout::infit::detail::remove_copy_impl(first, last, result, value, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_REMOVE_COPY_HPP diff --git a/sprout/algorithm/infit/remove_copy_if.hpp b/sprout/algorithm/infit/remove_copy_if.hpp new file mode 100644 index 00000000..a6e7f8de --- /dev/null +++ b/sprout/algorithm/infit/remove_copy_if.hpp @@ -0,0 +1,47 @@ +#ifndef SPROUT_ALGORITHM_INFIT_REMOVE_COPY_IF_HPP +#define SPROUT_ALGORITHM_INFIT_REMOVE_COPY_IF_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove_copy_if_impl( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::remove_copy_if(first, last, result, pred), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last) - NS_SSCRISK_CEL_OR_SPROUT_DETAIL::count_if(first, last, pred), sprout::size(result)) + ); + } + } // namespace detail + // + // remove_copy_if + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove_copy_if( + Iterator first, + Iterator last, + Result const& result, + Predicate pred + ) + { + return sprout::infit::detail::remove_copy_if_impl(first, last, result, pred, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_REMOVE_COPY_IF_HPP diff --git a/sprout/algorithm/infit/remove_if.hpp b/sprout/algorithm/infit/remove_if.hpp new file mode 100644 index 00000000..425285e0 --- /dev/null +++ b/sprout/algorithm/infit/remove_if.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_ALGORITHM_INFIT_REMOVE_IF_HPP +#define SPROUT_ALGORITHM_INFIT_REMOVE_IF_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove_if_impl( + Container const& cont, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::remove_if(cont, pred), + offset, + offset + sprout::size(cont) - NS_SSCRISK_CEL_OR_SPROUT_DETAIL::count_if(sprout::begin(cont), sprout::end(cont), pred) + ); + } + } // namespace detail + // + // remove_if + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove_if( + Container const& cont, + Predicate pred + ) + { + return sprout::infit::detail::remove_if_impl(cont, pred, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_REMOVE_IF_HPP diff --git a/sprout/algorithm/infit/replace.hpp b/sprout/algorithm/infit/replace.hpp new file mode 100644 index 00000000..64df7d4f --- /dev/null +++ b/sprout/algorithm/infit/replace.hpp @@ -0,0 +1,43 @@ +#ifndef SPROUT_ALGORITHM_INFIT_REPLACE_HPP +#define SPROUT_ALGORITHM_INFIT_REPLACE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace_impl( + Container const& cont, + T const& old_value, + T const& new_value, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::replace(cont, old_value, new_value), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // replace + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace( + Container const& cont, + T const& old_value, + T const& new_value + ) + { + return sprout::infit::detail::replace_impl(cont, old_value, new_value, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_REPLACE_HPP diff --git a/sprout/algorithm/infit/replace_copy.hpp b/sprout/algorithm/infit/replace_copy.hpp new file mode 100644 index 00000000..1d9d86c0 --- /dev/null +++ b/sprout/algorithm/infit/replace_copy.hpp @@ -0,0 +1,49 @@ +#ifndef SPROUT_ALGORITHM_INFIT_REPLACE_COPY_HPP +#define SPROUT_ALGORITHM_INFIT_REPLACE_COPY_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace_copy_impl( + Iterator first, + Iterator last, + Result const& result, + T const& old_value, + T const& new_value, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::replace_copy(first, last, result, old_value, new_value), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last), sprout::size(result)) + ); + } + } // namespace detail + // + // replace_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace_copy( + Iterator first, + Iterator last, + Result const& result, + T const& old_value, + T const& new_value + ) + { + return sprout::infit::detail::replace_copy_impl(first, last, result, old_value, new_value, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_REPLACE_COPY_HPP diff --git a/sprout/algorithm/infit/replace_copy_if.hpp b/sprout/algorithm/infit/replace_copy_if.hpp new file mode 100644 index 00000000..e4544717 --- /dev/null +++ b/sprout/algorithm/infit/replace_copy_if.hpp @@ -0,0 +1,49 @@ +#ifndef SPROUT_ALGORITHM_INFIT_REPLACE_COPY_IF_HPP +#define SPROUT_ALGORITHM_INFIT_REPLACE_COPY_IF_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace_copy_if_impl( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + T const& new_value, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::replace_copy_if(first, last, result, pred, new_value), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last), sprout::size(result)) + ); + } + } // namespace detail + // + // replace_copy_if + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace_copy_if( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + T const& new_value + ) + { + return sprout::infit::detail::replace_copy_if_impl(first, last, result, pred, new_value, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_REPLACE_COPY_IF_HPP diff --git a/sprout/algorithm/infit/replace_if.hpp b/sprout/algorithm/infit/replace_if.hpp new file mode 100644 index 00000000..2a2ec497 --- /dev/null +++ b/sprout/algorithm/infit/replace_if.hpp @@ -0,0 +1,43 @@ +#ifndef SPROUT_ALGORITHM_INFIT_REPLACE_IF_HPP +#define SPROUT_ALGORITHM_INFIT_REPLACE_IF_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace_if_impl( + Container const& cont, + Predicate pred, + T const& new_value, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::replace_if(cont, pred, new_value), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // replace_if + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace_if( + Container const& cont, + Predicate pred, + T const& new_value + ) + { + return sprout::infit::detail::replace_if_impl(cont, pred, new_value, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_REPLACE_IF_HPP diff --git a/sprout/algorithm/infit/reverse.hpp b/sprout/algorithm/infit/reverse.hpp new file mode 100644 index 00000000..7eb58d24 --- /dev/null +++ b/sprout/algorithm/infit/reverse.hpp @@ -0,0 +1,39 @@ +#ifndef SPROUT_ALGORITHM_INFIT_REVERSE_HPP +#define SPROUT_ALGORITHM_INFIT_REVERSE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> reverse_impl( + Container const& cont, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::reverse(cont), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // reverse + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> reverse( + Container const& cont + ) + { + return sprout::infit::detail::reverse_impl(cont, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_REVERSE_HPP diff --git a/sprout/algorithm/infit/reverse_copy.hpp b/sprout/algorithm/infit/reverse_copy.hpp new file mode 100644 index 00000000..a847d689 --- /dev/null +++ b/sprout/algorithm/infit/reverse_copy.hpp @@ -0,0 +1,45 @@ +#ifndef SPROUT_ALGORITHM_INFIT_REVERSE_COPY_HPP +#define SPROUT_ALGORITHM_INFIT_REVERSE_COPY_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> reverse_copy_impl( + Iterator first, + Iterator last, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::reverse_copy(first, last, result), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last), sprout::size(result)) + ); + } + } // namespace detail + // + // reverse_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> reverse_copy( + Iterator first, + Iterator last, + Result const& result + ) + { + return sprout::infit::detail::reverse_copy_impl(first, last, result, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_REVERSE_COPY_HPP diff --git a/sprout/algorithm/infit/rotate.hpp b/sprout/algorithm/infit/rotate.hpp new file mode 100644 index 00000000..5efcc8a7 --- /dev/null +++ b/sprout/algorithm/infit/rotate.hpp @@ -0,0 +1,41 @@ +#ifndef SPROUT_ALGORITHM_INFIT_ROTATE_HPP +#define SPROUT_ALGORITHM_INFIT_ROTATE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> rotate_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::rotate(cont, middle), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // rotate + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> rotate( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle + ) + { + return sprout::infit::detail::rotate_impl(cont, middle, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_ROTATE_HPP diff --git a/sprout/algorithm/infit/rotate_copy.hpp b/sprout/algorithm/infit/rotate_copy.hpp new file mode 100644 index 00000000..434954a0 --- /dev/null +++ b/sprout/algorithm/infit/rotate_copy.hpp @@ -0,0 +1,47 @@ +#ifndef SPROUT_ALGORITHM_INFIT_ROTATE_COPY_HPP +#define SPROUT_ALGORITHM_INFIT_ROTATE_COPY_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> rotate_copy_impl( + Iterator first, + Iterator middle, + Iterator last, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::rotate_copy(first, middle, last, result), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last), sprout::size(result)) + ); + } + } // namespace detail + // + // rotate_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> rotate_copy( + Iterator first, + Iterator middle, + Iterator last, + Result const& result + ) + { + return sprout::infit::detail::rotate_copy_impl(first, middle, last, result, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_ROTATE_COPY_HPP diff --git a/sprout/algorithm/infit/set_difference.hpp b/sprout/algorithm/infit/set_difference.hpp new file mode 100644 index 00000000..6e657fb9 --- /dev/null +++ b/sprout/algorithm/infit/set_difference.hpp @@ -0,0 +1,95 @@ +#ifndef SPROUT_ALGORITHM_INFIT_SET_DIFFERENCE_HPP +#define SPROUT_ALGORITHM_INFIT_SET_DIFFERENCE_HPP + +#include +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_difference_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::set_difference(first1, last1, first2, last2, result, comp), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min( + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first1, last1) + - sprout::detail::overlap_count_2(first1, last1, first2, last2, comp) + , + sprout::size(result) + ) + ); + } + } // namespace detail + // + // set_difference + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_difference( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return sprout::infit::detail::set_difference_impl(first1, last1, first2, last2, result, comp, sprout::fixed_begin_offset(result)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_difference_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::set_difference(first1, last1, first2, last2, result), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min( + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first1, last1) + - sprout::detail::overlap_count_2(first1, last1, first2, last2) + , + sprout::size(result) + ) + ); + } + } // namespace detail + // + // set_difference + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_difference( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result + ) + { + return sprout::infit::detail::set_difference_impl(first1, last1, first2, last2, result, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_SET_DIFFERENCE_HPP diff --git a/sprout/algorithm/infit/set_intersection.hpp b/sprout/algorithm/infit/set_intersection.hpp new file mode 100644 index 00000000..b32d87f1 --- /dev/null +++ b/sprout/algorithm/infit/set_intersection.hpp @@ -0,0 +1,90 @@ +#ifndef SPROUT_ALGORITHM_INFIT_SET_INTERSECTION_HPP +#define SPROUT_ALGORITHM_INFIT_SET_INTERSECTION_HPP + +#include +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_intersection_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::set_intersection(first1, last1, first2, last2, result, comp), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min( + sprout::detail::overlap_count_2(first1, last1, first2, last2, comp), + sprout::size(result) + ) + ); + } + } // namespace detail + // + // set_intersection + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_intersection( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return sprout::infit::detail::set_intersection_impl(first1, last1, first2, last2, result, comp, sprout::fixed_begin_offset(result)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_intersection_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::set_intersection(first1, last1, first2, last2, result), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min( + sprout::detail::overlap_count_2(first1, last1, first2, last2), + sprout::size(result) + ) + ); + } + } // namespace detail + // + // set_intersection + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_intersection( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result + ) + { + return sprout::infit::detail::set_intersection_impl(first1, last1, first2, last2, result, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_SET_INTERSECTION_HPP diff --git a/sprout/algorithm/infit/set_symmetric_difference.hpp b/sprout/algorithm/infit/set_symmetric_difference.hpp new file mode 100644 index 00000000..de0f22d0 --- /dev/null +++ b/sprout/algorithm/infit/set_symmetric_difference.hpp @@ -0,0 +1,97 @@ +#ifndef SPROUT_ALGORITHM_INFIT_SET_SYMMETRIC_DIFFERENCE_HPP +#define SPROUT_ALGORITHM_INFIT_SET_SYMMETRIC_DIFFERENCE_HPP + +#include +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_symmetric_difference_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::set_symmetric_difference(first1, last1, first2, last2, result, comp), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min( + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first1, last1) + + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first2, last2) + - 2 * sprout::detail::overlap_count_2(first1, last1, first2, last2, comp) + , + sprout::size(result) + ) + ); + } + } // namespace detail + // + // set_symmetric_difference + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_symmetric_difference( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return sprout::infit::detail::set_symmetric_difference_impl(first1, last1, first2, last2, result, comp, sprout::fixed_begin_offset(result)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_symmetric_difference_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::set_symmetric_difference(first1, last1, first2, last2, result), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min( + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first1, last1) + + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first2, last2) + - 2 * sprout::detail::overlap_count_2(first1, last1, first2, last2) + , + sprout::size(result) + ) + ); + } + } // namespace detail + // + // set_symmetric_difference + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_symmetric_difference( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result + ) + { + return sprout::infit::detail::set_symmetric_difference_impl(first1, last1, first2, last2, result, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_SET_SYMMETRIC_DIFFERENCE_HPP diff --git a/sprout/algorithm/infit/set_union.hpp b/sprout/algorithm/infit/set_union.hpp new file mode 100644 index 00000000..02f398e4 --- /dev/null +++ b/sprout/algorithm/infit/set_union.hpp @@ -0,0 +1,97 @@ +#ifndef SPROUT_ALGORITHM_INFIT_SET_UNION_HPP +#define SPROUT_ALGORITHM_INFIT_SET_UNION_HPP + +#include +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_union_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::set_union(first1, last1, first2, last2, result, comp), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min( + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first1, last1) + + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first2, last2) + - sprout::detail::overlap_count_2(first1, last1, first2, last2, comp) + , + sprout::size(result) + ) + ); + } + } // namespace detail + // + // set_union + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_union( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return sprout::infit::detail::set_union_impl(first1, last1, first2, last2, result, comp, sprout::fixed_begin_offset(result)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_union_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::set_union(first1, last1, first2, last2, result), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min( + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first1, last1) + + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first2, last2) + - sprout::detail::overlap_count_2(first1, last1, first2, last2) + , + sprout::size(result) + ) + ); + } + } // namespace detail + // + // set_union + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_union( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result + ) + { + return sprout::infit::detail::set_union_impl(first1, last1, first2, last2, result, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_SET_UNION_HPP diff --git a/sprout/algorithm/infit/sort.hpp b/sprout/algorithm/infit/sort.hpp new file mode 100644 index 00000000..1eb2e5d1 --- /dev/null +++ b/sprout/algorithm/infit/sort.hpp @@ -0,0 +1,66 @@ +#ifndef SPROUT_ALGORITHM_INFIT_SORT_HPP +#define SPROUT_ALGORITHM_INFIT_SORT_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> sort_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::sort(cont, comp), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // sort + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> sort( + Container const& cont, + Compare comp + ) + { + return sprout::infit::detail::sort_impl(cont, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> sort_impl( + Container const& cont, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::sort(cont), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // sort + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> sort( + Container const& cont + ) + { + return sprout::infit::detail::sort_impl(cont, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_SORT_HPP diff --git a/sprout/algorithm/infit/sort_heap.hpp b/sprout/algorithm/infit/sort_heap.hpp new file mode 100644 index 00000000..7788901f --- /dev/null +++ b/sprout/algorithm/infit/sort_heap.hpp @@ -0,0 +1,66 @@ +#ifndef SPROUT_ALGORITHM_INFIT_SORT_HEAP_HPP +#define SPROUT_ALGORITHM_INFIT_SORT_HEAP_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> sort_heap_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::sort_heap(cont, comp), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // sort_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> sort_heap( + Container const& cont, + Compare comp + ) + { + return sprout::infit::detail::sort_heap_impl(cont, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> sort_heap_impl( + Container const& cont, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::sort_heap(cont), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // sort_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> sort_heap( + Container const& cont + ) + { + return sprout::infit::detail::sort_heap_impl(cont, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_SORT_HEAP_HPP diff --git a/sprout/algorithm/infit/stable_partition.hpp b/sprout/algorithm/infit/stable_partition.hpp new file mode 100644 index 00000000..0576a289 --- /dev/null +++ b/sprout/algorithm/infit/stable_partition.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_ALGORITHM_INFIT_STABLE_PARTITION_HPP +#define SPROUT_ALGORITHM_INFIT_STABLE_PARTITION_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> stable_partition_impl( + Container const& cont, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::stable_partition(cont, pred), + offset, + offset + sprout::size(cont) - NS_SSCRISK_CEL_OR_SPROUT_DETAIL::count_if(sprout::begin(cont), sprout::end(cont), pred) + ); + } + } // namespace detail + // + // stable_partition + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> stable_partition( + Container const& cont, + Predicate pred + ) + { + return sprout::infit::detail::stable_partition_impl(cont, pred, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_STABLE_PARTITION_HPP diff --git a/sprout/algorithm/infit/stable_partition_copy.hpp b/sprout/algorithm/infit/stable_partition_copy.hpp new file mode 100644 index 00000000..5260c6ae --- /dev/null +++ b/sprout/algorithm/infit/stable_partition_copy.hpp @@ -0,0 +1,46 @@ +#ifndef SPROUT_ALGORITHM_INFIT_STABLE_PARTITION_COPY_HPP +#define SPROUT_ALGORITHM_INFIT_STABLE_PARTITION_COPY_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> stable_partition_copy_impl( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::stable_partition_copy(first, last, result, pred), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::count_if(first, last, pred), sprout::size(result)) + ); + } + } // namespace detail + // + // stable_partition_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> stable_partition_copy( + Iterator first, + Iterator last, + Result const& result, + Predicate pred + ) + { + return sprout::infit::detail::stable_partition_copy_impl(first, last, result, pred, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_STABLE_PARTITION_COPY_HPP diff --git a/sprout/algorithm/infit/stable_sort.hpp b/sprout/algorithm/infit/stable_sort.hpp new file mode 100644 index 00000000..f9396533 --- /dev/null +++ b/sprout/algorithm/infit/stable_sort.hpp @@ -0,0 +1,66 @@ +#ifndef SPROUT_ALGORITHM_INFIT_STABLE_SORT_HPP +#define SPROUT_ALGORITHM_INFIT_STABLE_SORT_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> stable_sort_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::stable_sort(cont, comp), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // stable_sort + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> stable_sort( + Container const& cont, + Compare comp + ) + { + return sprout::infit::detail::stable_sort_impl(cont, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> stable_sort_impl( + Container const& cont, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::stable_sort(cont), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // stable_sort + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> stable_sort( + Container const& cont + ) + { + return sprout::infit::detail::stable_sort_impl(cont, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_STABLE_SORT_HPP diff --git a/sprout/algorithm/infit/swap_element.hpp b/sprout/algorithm/infit/swap_element.hpp new file mode 100644 index 00000000..ce7f9ab1 --- /dev/null +++ b/sprout/algorithm/infit/swap_element.hpp @@ -0,0 +1,43 @@ +#ifndef SPROUT_ALGORITHM_INFIT_SWAP_ELEMENT_HPP +#define SPROUT_ALGORITHM_INFIT_SWAP_ELEMENT_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> swap_element_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator pos1, + typename sprout::fixed_container_traits::const_iterator pos2, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::swap_element(cont, pos1, pos2), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // swap_element + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> swap_element( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator pos1, + typename sprout::fixed_container_traits::const_iterator pos2 + ) + { + return sprout::infit::detail::swap_element_impl(cont, pos1, pos2, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_SWAP_ELEMENT_HPP diff --git a/sprout/algorithm/infit/swap_element_copy.hpp b/sprout/algorithm/infit/swap_element_copy.hpp new file mode 100644 index 00000000..b568ce6f --- /dev/null +++ b/sprout/algorithm/infit/swap_element_copy.hpp @@ -0,0 +1,49 @@ +#ifndef SPROUT_ALGORITHM_INFIT_SWAP_ELEMENT_COPY_HPP +#define SPROUT_ALGORITHM_INFIT_SWAP_ELEMENT_COPY_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> swap_element_copy_impl( + Iterator first, + Iterator last, + Result const& result, + Iterator pos1, + Iterator pos2, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::swap_element_copy(first, last, result, pos1, pos2), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last), sprout::size(result)) + ); + } + } // namespace detail + // + // swap_element_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> swap_element_copy( + Iterator first, + Iterator last, + Result const& result, + Iterator pos1, + Iterator pos2 + ) + { + return sprout::infit::detail::swap_element_copy_impl(first, last, result, pos1, pos2, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_SWAP_ELEMENT_COPY_HPP diff --git a/sprout/algorithm/infit/transform.hpp b/sprout/algorithm/infit/transform.hpp new file mode 100644 index 00000000..aa8bffd3 --- /dev/null +++ b/sprout/algorithm/infit/transform.hpp @@ -0,0 +1,80 @@ +#ifndef SPROUT_ALGORITHM_INFIT_TRANSFORM_HPP +#define SPROUT_ALGORITHM_INFIT_TRANSFORM_HPP + +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> transform_impl( + Iterator first, + Iterator last, + Result const& result, + UnaryOperation op, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::transform(first, last, result, op), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last), sprout::size(result)) + ); + } + } // namespace detail + // + // transform + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> transform( + Iterator first, + Iterator last, + Result const& result, + UnaryOperation op + ) + { + return sprout::infit::detail::transform_impl(first, last, result, op, sprout::fixed_begin_offset(result)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> transform_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Result const& result, + BinaryOperation op, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::transform(first1, last1, first2, result, op), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first1, last1), sprout::size(result)) + ); + } + } // namespace detail + // + // transform + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> transform( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Result const& result, + BinaryOperation op + ) + { + return sprout::infit::detail::transform_impl(first1, last1, first2, result, op, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_TRANSFORM_HPP diff --git a/sprout/algorithm/infit/unique.hpp b/sprout/algorithm/infit/unique.hpp new file mode 100644 index 00000000..1d26ebcf --- /dev/null +++ b/sprout/algorithm/infit/unique.hpp @@ -0,0 +1,67 @@ +#ifndef SPROUT_ALGORITHM_INFIT_UNIQUE_HPP +#define SPROUT_ALGORITHM_INFIT_UNIQUE_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique_impl( + Container const& cont, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::unique(cont), + offset, + offset + sprout::size(cont) - sprout::detail::overlap_count(sprout::begin(cont), sprout::end(cont)) + ); + } + } // namespace detail + // + // unique + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique( + Container const& cont + ) + { + return sprout::infit::detail::unique_impl(cont, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique_impl( + Container const& cont, + BinaryPredicate pred, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::unique(cont, pred), + offset, + offset + sprout::size(cont) - sprout::detail::overlap_count(sprout::begin(cont), sprout::end(cont), pred) + ); + } + } // namespace detail + // + // unique + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique( + Container const& cont, + BinaryPredicate pred + ) + { + return sprout::infit::detail::unique_impl(cont, pred, sprout::fixed_begin_offset(cont)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_UNIQUE_HPP diff --git a/sprout/algorithm/infit/unique_copy.hpp b/sprout/algorithm/infit/unique_copy.hpp new file mode 100644 index 00000000..d4e7b35e --- /dev/null +++ b/sprout/algorithm/infit/unique_copy.hpp @@ -0,0 +1,77 @@ +#ifndef SPROUT_ALGORITHM_INFIT_UNIQUE_COPY_HPP +#define SPROUT_ALGORITHM_INFIT_UNIQUE_COPY_HPP + +#include +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace infit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique_copy_impl( + Iterator first, + Iterator last, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::unique_copy(first, last, result), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last) - sprout::detail::overlap_count(first, last), sprout::size(result)) + ); + } + } // namespace detail + // + // unique_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique_copy( + Iterator first, + Iterator last, + Result const& result + ) + { + return sprout::infit::detail::unique_copy_impl(first, last, result, sprout::fixed_begin_offset(result)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique_copy_impl( + Iterator first, + Iterator last, + Result const& result, + BinaryPredicate pred, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::unique_copy(first, last, result, pred), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last) - sprout::detail::overlap_count(first, last, pred), sprout::size(result)) + ); + } + } // namespace detail + // + // unique_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique_copy( + Iterator first, + Iterator last, + Result const& result, + BinaryPredicate pred + ) + { + return sprout::infit::detail::unique_copy_impl(first, last, result, pred, sprout::fixed_begin_offset(result)); + } + } // namespace infit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_INFIT_UNIQUE_COPY_HPP diff --git a/sprout/algorithm/inplace_merge.hpp b/sprout/algorithm/inplace_merge.hpp new file mode 100644 index 00000000..7a519dad --- /dev/null +++ b/sprout/algorithm/inplace_merge.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_INPLACE_MERGE_HPP +#define SPROUT_ALGORITHM_INPLACE_MERGE_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_INPLACE_MERGE_HPP diff --git a/sprout/algorithm/make_heap.hpp b/sprout/algorithm/make_heap.hpp new file mode 100644 index 00000000..2c02c254 --- /dev/null +++ b/sprout/algorithm/make_heap.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_MAKE_HEAP_HPP +#define SPROUT_ALGORITHM_MAKE_HEAP_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_MAKE_HEAP_HPP diff --git a/sprout/algorithm/make_partial_heap.hpp b/sprout/algorithm/make_partial_heap.hpp new file mode 100644 index 00000000..94ce96ed --- /dev/null +++ b/sprout/algorithm/make_partial_heap.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_MAKE_PARTIAL_HEAP_HPP +#define SPROUT_ALGORITHM_MAKE_PARTIAL_HEAP_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_MAKE_PARTIAL_HEAP_HPP diff --git a/sprout/algorithm/merge.hpp b/sprout/algorithm/merge.hpp new file mode 100644 index 00000000..89eb1a12 --- /dev/null +++ b/sprout/algorithm/merge.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_MERGE_HPP +#define SPROUT_ALGORITHM_MERGE_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_MERGE_HPP diff --git a/sprout/algorithm/nth_element.hpp b/sprout/algorithm/nth_element.hpp new file mode 100644 index 00000000..bc4642ee --- /dev/null +++ b/sprout/algorithm/nth_element.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_NTH_ELEMENT_HPP +#define SPROUT_ALGORITHM_NTH_ELEMENT_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_NTH_ELEMENT_HPP diff --git a/sprout/algorithm/outfit.hpp b/sprout/algorithm/outfit.hpp new file mode 100644 index 00000000..ea23513a --- /dev/null +++ b/sprout/algorithm/outfit.hpp @@ -0,0 +1,50 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_HPP +#define SPROUT_ALGORITHM_OUTFIT_HPP + +#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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_HPP diff --git a/sprout/algorithm/outfit/copy.hpp b/sprout/algorithm/outfit/copy.hpp new file mode 100644 index 00000000..038dad3e --- /dev/null +++ b/sprout/algorithm/outfit/copy.hpp @@ -0,0 +1,43 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_COPY_HPP +#define SPROUT_ALGORITHM_OUTFIT_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy_impl( + Iterator first, + Iterator last, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::copy(first, last, result), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy( + Iterator first, + Iterator last, + Result const& result + ) + { + return sprout::outfit::detail::copy_impl(first, last, result, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_COPY_HPP diff --git a/sprout/algorithm/outfit/copy_backward.hpp b/sprout/algorithm/outfit/copy_backward.hpp new file mode 100644 index 00000000..5a4683bc --- /dev/null +++ b/sprout/algorithm/outfit/copy_backward.hpp @@ -0,0 +1,43 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_COPY_BACKWARD_HPP +#define SPROUT_ALGORITHM_OUTFIT_COPY_BACKWARD_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy_backward_impl( + Iterator first, + Iterator last, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::copy_backward(first, last, result), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // copy_backward + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy_backward( + Iterator first, + Iterator last, + Result const& result + ) + { + return sprout::outfit::detail::copy_backward_impl(first, last, result, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_COPY_BACKWARD_HPP diff --git a/sprout/algorithm/outfit/copy_if.hpp b/sprout/algorithm/outfit/copy_if.hpp new file mode 100644 index 00000000..2f38cdea --- /dev/null +++ b/sprout/algorithm/outfit/copy_if.hpp @@ -0,0 +1,45 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_COPY_IF_HPP +#define SPROUT_ALGORITHM_OUTFIT_COPY_IF_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy_if_impl( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::copy_if(first, last, result, pred), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // copy_if + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy_if( + Iterator first, + Iterator last, + Result const& result, + Predicate pred + ) + { + return sprout::outfit::detail::copy_if_impl(first, last, result, pred, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_COPY_IF_HPP diff --git a/sprout/algorithm/outfit/copy_n.hpp b/sprout/algorithm/outfit/copy_n.hpp new file mode 100644 index 00000000..5341f369 --- /dev/null +++ b/sprout/algorithm/outfit/copy_n.hpp @@ -0,0 +1,43 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_COPY_N_HPP +#define SPROUT_ALGORITHM_OUTFIT_COPY_N_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy_n_impl( + Iterator first, + Size n, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::copy_n(first, n, result), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // copy_n + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy_n( + Iterator first, + Size n, + Result const& result + ) + { + return sprout::outfit::detail::copy_n_impl(first, n, result, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_COPY_N_HPP diff --git a/sprout/algorithm/outfit/fill.hpp b/sprout/algorithm/outfit/fill.hpp new file mode 100644 index 00000000..acb68583 --- /dev/null +++ b/sprout/algorithm/outfit/fill.hpp @@ -0,0 +1,41 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_FILL_HPP +#define SPROUT_ALGORITHM_OUTFIT_FILL_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> fill_impl( + Container const& cont, + T const& value, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::fill(cont, value), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // fill + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> fill( + Container const& cont, + T const& value + ) + { + return sprout::outfit::detail::fill_impl(cont, value, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_FILL_HPP diff --git a/sprout/algorithm/outfit/fill_n.hpp b/sprout/algorithm/outfit/fill_n.hpp new file mode 100644 index 00000000..7dab177e --- /dev/null +++ b/sprout/algorithm/outfit/fill_n.hpp @@ -0,0 +1,43 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_FILL_SUB_N_HPP +#define SPROUT_ALGORITHM_OUTFIT_FILL_SUB_N_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> fill_n_impl( + Container const& cont, + Size n, + T const& value, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::fill_n(cont, n, value), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // fill_n + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> fill_n( + Container const& cont, + Size n, + T const& value + ) + { + return sprout::outfit::detail::fill_n_impl(cont, n, value, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_FILL_SUB_N_HPP diff --git a/sprout/algorithm/outfit/generate.hpp b/sprout/algorithm/outfit/generate.hpp new file mode 100644 index 00000000..277ca466 --- /dev/null +++ b/sprout/algorithm/outfit/generate.hpp @@ -0,0 +1,43 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_GENERATE_HPP +#define SPROUT_ALGORITHM_OUTFIT_GENERATE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> generate_impl( + Container const& cont, + Generator gen, + typename sprout::fixed_container_traits::difference_type offset, + Inits const&... inits + ) + { + return sprout::sub_copy( + sprout::fixed::generate(cont, gen, inits...), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // generate + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> generate( + Container const& cont, + Generator gen, + Inits const&... inits + ) + { + return sprout::outfit::detail::generate_impl(cont, gen, sprout::fixed_begin_offset(cont), inits...); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_GENERATE_HPP diff --git a/sprout/algorithm/outfit/generate_n.hpp b/sprout/algorithm/outfit/generate_n.hpp new file mode 100644 index 00000000..cea5b7e3 --- /dev/null +++ b/sprout/algorithm/outfit/generate_n.hpp @@ -0,0 +1,45 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_GENERATE_N_HPP +#define SPROUT_ALGORITHM_OUTFIT_GENERATE_N_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> generate_n_impl( + Container const& cont, + Size n, + Generator gen, + typename sprout::fixed_container_traits::difference_type offset, + Inits const&... inits + ) + { + return sprout::sub_copy( + sprout::fixed::generate_n(cont, n, gen, inits...), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // generate_n + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> generate_n( + Container const& cont, + Size n, + Generator gen, + Inits const&... inits + ) + { + return sprout::outfit::detail::generate_n_impl(cont, n, gen, sprout::fixed_begin_offset(cont), inits...); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_GENERATE_N_HPP diff --git a/sprout/algorithm/outfit/inplace_merge.hpp b/sprout/algorithm/outfit/inplace_merge.hpp new file mode 100644 index 00000000..10c6b3b1 --- /dev/null +++ b/sprout/algorithm/outfit/inplace_merge.hpp @@ -0,0 +1,70 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_INPLACE_MERGE_HPP +#define SPROUT_ALGORITHM_OUTFIT_INPLACE_MERGE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> inplace_merge_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::inplace_merge(cont, middle, comp), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // inplace_merge + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> inplace_merge( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + Compare comp + ) + { + return sprout::outfit::detail::inplace_merge_impl(cont, middle, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> inplace_merge_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::inplace_merge(cont, middle), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // inplace_merge + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> inplace_merge( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle + ) + { + return sprout::outfit::detail::inplace_merge_impl(cont, middle, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_INPLACE_MERGE_HPP diff --git a/sprout/algorithm/outfit/make_heap.hpp b/sprout/algorithm/outfit/make_heap.hpp new file mode 100644 index 00000000..2bb15090 --- /dev/null +++ b/sprout/algorithm/outfit/make_heap.hpp @@ -0,0 +1,66 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_MAKE_HEAP_HPP +#define SPROUT_ALGORITHM_OUTFIT_MAKE_HEAP_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> make_heap_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::make_heap(cont, comp), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // make_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> make_heap( + Container const& cont, + Compare comp + ) + { + return sprout::outfit::detail::make_heap_impl(cont, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> make_heap_impl( + Container const& cont, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::make_heap(cont), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // make_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> make_heap( + Container const& cont + ) + { + return sprout::outfit::detail::make_heap_impl(cont, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_MAKE_HEAP_HPP diff --git a/sprout/algorithm/outfit/make_partial_heap.hpp b/sprout/algorithm/outfit/make_partial_heap.hpp new file mode 100644 index 00000000..bb4d3f83 --- /dev/null +++ b/sprout/algorithm/outfit/make_partial_heap.hpp @@ -0,0 +1,70 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_MAKE_PARTIAL_HEAP_HPP +#define SPROUT_ALGORITHM_OUTFIT_MAKE_PARTIAL_HEAP_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> make_partial_heap_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::make_partial_heap(cont, middle, comp), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // make_partial_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> make_partial_heap( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + Compare comp + ) + { + return sprout::outfit::detail::make_partial_heap_impl(cont, middle, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> make_partial_heap_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::make_partial_heap(cont, middle), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // make_partial_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> make_partial_heap( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle + ) + { + return sprout::outfit::detail::make_partial_heap_impl(cont, middle, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_MAKE_PARTIAL_HEAP_HPP diff --git a/sprout/algorithm/outfit/merge.hpp b/sprout/algorithm/outfit/merge.hpp new file mode 100644 index 00000000..97a4596a --- /dev/null +++ b/sprout/algorithm/outfit/merge.hpp @@ -0,0 +1,82 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_MERGE_HPP +#define SPROUT_ALGORITHM_OUTFIT_MERGE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> merge_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::merge(first1, last1, first2, last2, result, comp), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // merge + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> merge( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return sprout::outfit::detail::merge_impl(first1, last1, first2, last2, result, comp, sprout::fixed_begin_offset(result)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> merge_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::merge(first1, last1, first2, last2, result), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // merge + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> merge( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result + ) + { + return sprout::outfit::detail::merge_impl(first1, last1, first2, last2, result, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_MERGE_HPP diff --git a/sprout/algorithm/outfit/nth_element.hpp b/sprout/algorithm/outfit/nth_element.hpp new file mode 100644 index 00000000..7c895e15 --- /dev/null +++ b/sprout/algorithm/outfit/nth_element.hpp @@ -0,0 +1,70 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_NTH_ELEMENT_HPP +#define SPROUT_ALGORITHM_OUTFIT_NTH_ELEMENT_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> nth_element_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator nth, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::nth_element(cont, nth, comp), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // nth_element + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> nth_element( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator nth, + Compare comp + ) + { + return sprout::outfit::detail::nth_element_impl(cont, nth, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> nth_element_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator nth, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::nth_element(cont, nth), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // nth_element + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> nth_element( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator nth + ) + { + return sprout::outfit::detail::nth_element_impl(cont, nth, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_NTH_ELEMENT_HPP diff --git a/sprout/algorithm/outfit/partial_sort.hpp b/sprout/algorithm/outfit/partial_sort.hpp new file mode 100644 index 00000000..3237dd83 --- /dev/null +++ b/sprout/algorithm/outfit/partial_sort.hpp @@ -0,0 +1,70 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_PARTIAL_SORT_HPP +#define SPROUT_ALGORITHM_OUTFIT_PARTIAL_SORT_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> partial_sort_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::partial_sort(cont, middle, comp), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // partial_sort + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> partial_sort( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + Compare comp + ) + { + return sprout::outfit::detail::partial_sort_impl(cont, middle, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> partial_sort_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::partial_sort(cont, middle), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // partial_sort + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> partial_sort( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle + ) + { + return sprout::outfit::detail::partial_sort_impl(cont, middle, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_PARTIAL_SORT_HPP diff --git a/sprout/algorithm/outfit/partition.hpp b/sprout/algorithm/outfit/partition.hpp new file mode 100644 index 00000000..6ea617bf --- /dev/null +++ b/sprout/algorithm/outfit/partition.hpp @@ -0,0 +1,41 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_PARTITION_HPP +#define SPROUT_ALGORITHM_OUTFIT_PARTITION_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> partition_impl( + Container const& cont, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::partition(cont, pred), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // partition + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> partition( + Container const& cont, + Predicate pred + ) + { + return sprout::outfit::detail::partition_impl(cont, pred, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_PARTITION_HPP diff --git a/sprout/algorithm/outfit/partition_copy.hpp b/sprout/algorithm/outfit/partition_copy.hpp new file mode 100644 index 00000000..d248d339 --- /dev/null +++ b/sprout/algorithm/outfit/partition_copy.hpp @@ -0,0 +1,45 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_PARTITION_COPY_HPP +#define SPROUT_ALGORITHM_OUTFIT_PARTITION_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> partition_copy_impl( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::partition_copy(first, last, result, pred), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // partition_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> partition_copy( + Iterator first, + Iterator last, + Result const& result, + Predicate pred + ) + { + return sprout::outfit::detail::partition_copy_impl(first, last, result, pred, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_PARTITION_COPY_HPP diff --git a/sprout/algorithm/outfit/pop_heap.hpp b/sprout/algorithm/outfit/pop_heap.hpp new file mode 100644 index 00000000..cb09e471 --- /dev/null +++ b/sprout/algorithm/outfit/pop_heap.hpp @@ -0,0 +1,66 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_POP_HEAP_HPP +#define SPROUT_ALGORITHM_OUTFIT_POP_HEAP_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> pop_heap_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::pop_heap(cont, comp), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // pop_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> pop_heap( + Container const& cont, + Compare comp + ) + { + return sprout::outfit::detail::pop_heap_impl(cont, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> pop_heap_impl( + Container const& cont, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::pop_heap(cont), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // pop_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> pop_heap( + Container const& cont + ) + { + return sprout::outfit::detail::pop_heap_impl(cont, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_POP_HEAP_HPP diff --git a/sprout/algorithm/outfit/push_heap.hpp b/sprout/algorithm/outfit/push_heap.hpp new file mode 100644 index 00000000..0bb2c424 --- /dev/null +++ b/sprout/algorithm/outfit/push_heap.hpp @@ -0,0 +1,66 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_PUSH_HEAP_HPP +#define SPROUT_ALGORITHM_OUTFIT_PUSH_HEAP_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> push_heap_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::push_heap(cont, comp), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // push_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> push_heap( + Container const& cont, + Compare comp + ) + { + return sprout::outfit::detail::push_heap_impl(cont, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> push_heap_impl( + Container const& cont, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::push_heap(cont), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // push_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> push_heap( + Container const& cont + ) + { + return sprout::outfit::detail::push_heap_impl(cont, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_PUSH_HEAP_HPP diff --git a/sprout/algorithm/outfit/remove.hpp b/sprout/algorithm/outfit/remove.hpp new file mode 100644 index 00000000..17355c6d --- /dev/null +++ b/sprout/algorithm/outfit/remove.hpp @@ -0,0 +1,41 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_REMOVE_HPP +#define SPROUT_ALGORITHM_OUTFIT_REMOVE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove_impl( + Container const& cont, + T const& value, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::remove(cont, value), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // remove + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove( + Container const& cont, + T const& value + ) + { + return sprout::outfit::detail::remove_impl(cont, value, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_REMOVE_HPP diff --git a/sprout/algorithm/outfit/remove_copy.hpp b/sprout/algorithm/outfit/remove_copy.hpp new file mode 100644 index 00000000..91a9067b --- /dev/null +++ b/sprout/algorithm/outfit/remove_copy.hpp @@ -0,0 +1,45 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_REMOVE_COPY_HPP +#define SPROUT_ALGORITHM_OUTFIT_REMOVE_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove_copy_impl( + Iterator first, + Iterator last, + Result const& result, + T const& value, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::remove_copy(first, last, result, value), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // remove_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove_copy( + Iterator first, + Iterator last, + Result const& result, + T const& value + ) + { + return sprout::outfit::detail::remove_copy_impl(first, last, result, value, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_REMOVE_COPY_HPP diff --git a/sprout/algorithm/outfit/remove_copy_if.hpp b/sprout/algorithm/outfit/remove_copy_if.hpp new file mode 100644 index 00000000..9ef945c5 --- /dev/null +++ b/sprout/algorithm/outfit/remove_copy_if.hpp @@ -0,0 +1,45 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_REMOVE_COPY_IF_HPP +#define SPROUT_ALGORITHM_OUTFIT_REMOVE_COPY_IF_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove_copy_if_impl( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::remove_copy_if(first, last, result, pred), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // remove_copy_if + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove_copy_if( + Iterator first, + Iterator last, + Result const& result, + Predicate pred + ) + { + return sprout::outfit::detail::remove_copy_if_impl(first, last, result, pred, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_REMOVE_COPY_IF_HPP diff --git a/sprout/algorithm/outfit/remove_if.hpp b/sprout/algorithm/outfit/remove_if.hpp new file mode 100644 index 00000000..f990435c --- /dev/null +++ b/sprout/algorithm/outfit/remove_if.hpp @@ -0,0 +1,41 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_REMOVE_IF_HPP +#define SPROUT_ALGORITHM_OUTFIT_REMOVE_IF_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove_if_impl( + Container const& cont, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::remove_if(cont, pred), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // remove_if + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove_if( + Container const& cont, + Predicate pred + ) + { + return sprout::outfit::detail::remove_if_impl(cont, pred, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_REMOVE_IF_HPP diff --git a/sprout/algorithm/outfit/replace.hpp b/sprout/algorithm/outfit/replace.hpp new file mode 100644 index 00000000..2431eff6 --- /dev/null +++ b/sprout/algorithm/outfit/replace.hpp @@ -0,0 +1,43 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_REPLACE_HPP +#define SPROUT_ALGORITHM_OUTFIT_REPLACE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace_impl( + Container const& cont, + T const& old_value, + T const& new_value, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::replace(cont, old_value, new_value), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // replace + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace( + Container const& cont, + T const& old_value, + T const& new_value + ) + { + return sprout::outfit::detail::replace_impl(cont, old_value, new_value, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_REPLACE_HPP diff --git a/sprout/algorithm/outfit/replace_copy.hpp b/sprout/algorithm/outfit/replace_copy.hpp new file mode 100644 index 00000000..015b989e --- /dev/null +++ b/sprout/algorithm/outfit/replace_copy.hpp @@ -0,0 +1,47 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_REPLACE_COPY_HPP +#define SPROUT_ALGORITHM_OUTFIT_REPLACE_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace_copy_impl( + Iterator first, + Iterator last, + Result const& result, + T const& old_value, + T const& new_value, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::replace_copy(first, last, result, old_value, new_value), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // replace_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace_copy( + Iterator first, + Iterator last, + Result const& result, + T const& old_value, + T const& new_value + ) + { + return sprout::outfit::detail::replace_copy_impl(first, last, result, old_value, new_value, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_REPLACE_COPY_HPP diff --git a/sprout/algorithm/outfit/replace_copy_if.hpp b/sprout/algorithm/outfit/replace_copy_if.hpp new file mode 100644 index 00000000..3141957e --- /dev/null +++ b/sprout/algorithm/outfit/replace_copy_if.hpp @@ -0,0 +1,47 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_REPLACE_COPY_IF_HPP +#define SPROUT_ALGORITHM_OUTFIT_REPLACE_COPY_IF_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace_copy_if_impl( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + T const& new_value, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::replace_copy_if(first, last, result, pred, new_value), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // replace_copy_if + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace_copy_if( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + T const& new_value + ) + { + return sprout::outfit::detail::replace_copy_if_impl(first, last, result, pred, new_value, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_REPLACE_COPY_IF_HPP diff --git a/sprout/algorithm/outfit/replace_if.hpp b/sprout/algorithm/outfit/replace_if.hpp new file mode 100644 index 00000000..4948738f --- /dev/null +++ b/sprout/algorithm/outfit/replace_if.hpp @@ -0,0 +1,43 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_REPLACE_IF_HPP +#define SPROUT_ALGORITHM_OUTFIT_REPLACE_IF_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace_if_impl( + Container const& cont, + Predicate pred, + T const& new_value, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::replace_if(cont, pred, new_value), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // replace_if + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace_if( + Container const& cont, + Predicate pred, + T const& new_value + ) + { + return sprout::outfit::detail::replace_if_impl(cont, pred, new_value, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_REPLACE_IF_HPP diff --git a/sprout/algorithm/outfit/reverse.hpp b/sprout/algorithm/outfit/reverse.hpp new file mode 100644 index 00000000..c718294d --- /dev/null +++ b/sprout/algorithm/outfit/reverse.hpp @@ -0,0 +1,39 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_REVERSE_HPP +#define SPROUT_ALGORITHM_OUTFIT_REVERSE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> reverse_impl( + Container const& cont, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::reverse(cont), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // reverse + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> reverse( + Container const& cont + ) + { + return sprout::outfit::detail::reverse_impl(cont, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_REVERSE_HPP diff --git a/sprout/algorithm/outfit/reverse_copy.hpp b/sprout/algorithm/outfit/reverse_copy.hpp new file mode 100644 index 00000000..2136d992 --- /dev/null +++ b/sprout/algorithm/outfit/reverse_copy.hpp @@ -0,0 +1,43 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_REVERSE_COPY_HPP +#define SPROUT_ALGORITHM_OUTFIT_REVERSE_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> reverse_copy_impl( + Iterator first, + Iterator last, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::reverse_copy(first, last, result), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // reverse_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> reverse_copy( + Iterator first, + Iterator last, + Result const& result + ) + { + return sprout::outfit::detail::reverse_copy_impl(first, last, result, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_REVERSE_COPY_HPP diff --git a/sprout/algorithm/outfit/rotate.hpp b/sprout/algorithm/outfit/rotate.hpp new file mode 100644 index 00000000..d74dd49a --- /dev/null +++ b/sprout/algorithm/outfit/rotate.hpp @@ -0,0 +1,41 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_ROTATE_HPP +#define SPROUT_ALGORITHM_OUTFIT_ROTATE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> rotate_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::rotate(cont, middle), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // rotate + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> rotate( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator middle + ) + { + return sprout::outfit::detail::rotate_impl(cont, middle, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_ROTATE_HPP diff --git a/sprout/algorithm/outfit/rotate_copy.hpp b/sprout/algorithm/outfit/rotate_copy.hpp new file mode 100644 index 00000000..6f12b020 --- /dev/null +++ b/sprout/algorithm/outfit/rotate_copy.hpp @@ -0,0 +1,45 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_ROTATE_COPY_HPP +#define SPROUT_ALGORITHM_OUTFIT_ROTATE_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> rotate_copy_impl( + Iterator first, + Iterator middle, + Iterator last, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::rotate_copy(first, middle, last, result), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // rotate_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> rotate_copy( + Iterator first, + Iterator middle, + Iterator last, + Result const& result + ) + { + return sprout::outfit::detail::rotate_copy_impl(first, middle, last, result, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_ROTATE_COPY_HPP diff --git a/sprout/algorithm/outfit/set_difference.hpp b/sprout/algorithm/outfit/set_difference.hpp new file mode 100644 index 00000000..86e13623 --- /dev/null +++ b/sprout/algorithm/outfit/set_difference.hpp @@ -0,0 +1,82 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_SET_DIFFERENCE_HPP +#define SPROUT_ALGORITHM_OUTFIT_SET_DIFFERENCE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_difference_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::set_difference(first1, last1, first2, last2, result, comp), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // set_difference + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_difference( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return sprout::outfit::detail::set_difference_impl(first1, last1, first2, last2, result, comp, sprout::fixed_begin_offset(result)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_difference_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::set_difference(first1, last1, first2, last2, result), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // set_difference + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_difference( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result + ) + { + return sprout::outfit::detail::set_difference_impl(first1, last1, first2, last2, result, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_SET_DIFFERENCE_HPP diff --git a/sprout/algorithm/outfit/set_intersection.hpp b/sprout/algorithm/outfit/set_intersection.hpp new file mode 100644 index 00000000..085ae2c4 --- /dev/null +++ b/sprout/algorithm/outfit/set_intersection.hpp @@ -0,0 +1,82 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_SET_INTERSECTION_HPP +#define SPROUT_ALGORITHM_OUTFIT_SET_INTERSECTION_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_intersection_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::set_intersection(first1, last1, first2, last2, result, comp), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // set_intersection + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_intersection( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return sprout::outfit::detail::set_intersection_impl(first1, last1, first2, last2, result, comp, sprout::fixed_begin_offset(result)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_intersection_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::set_intersection(first1, last1, first2, last2, result), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // set_intersection + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_intersection( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result + ) + { + return sprout::outfit::detail::set_intersection_impl(first1, last1, first2, last2, result, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_SET_INTERSECTION_HPP diff --git a/sprout/algorithm/outfit/set_symmetric_difference.hpp b/sprout/algorithm/outfit/set_symmetric_difference.hpp new file mode 100644 index 00000000..e249e48f --- /dev/null +++ b/sprout/algorithm/outfit/set_symmetric_difference.hpp @@ -0,0 +1,82 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_SET_SYMMETRIC_DIFFERENCE_HPP +#define SPROUT_ALGORITHM_OUTFIT_SET_SYMMETRIC_DIFFERENCE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_symmetric_difference_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::set_symmetric_difference(first1, last1, first2, last2, result, comp), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // set_symmetric_difference + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_symmetric_difference( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return sprout::outfit::detail::set_symmetric_difference_impl(first1, last1, first2, last2, result, comp, sprout::fixed_begin_offset(result)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_symmetric_difference_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::set_symmetric_difference(first1, last1, first2, last2, result), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // set_symmetric_difference + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_symmetric_difference( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result + ) + { + return sprout::outfit::detail::set_symmetric_difference_impl(first1, last1, first2, last2, result, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_SET_SYMMETRIC_DIFFERENCE_HPP diff --git a/sprout/algorithm/outfit/set_union.hpp b/sprout/algorithm/outfit/set_union.hpp new file mode 100644 index 00000000..17f69aeb --- /dev/null +++ b/sprout/algorithm/outfit/set_union.hpp @@ -0,0 +1,82 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_SET_UNION_HPP +#define SPROUT_ALGORITHM_OUTFIT_SET_UNION_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_union_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::set_union(first1, last1, first2, last2, result, comp), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // set_union + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_union( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + Compare comp + ) + { + return sprout::outfit::detail::set_union_impl(first1, last1, first2, last2, result, comp, sprout::fixed_begin_offset(result)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_union_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::set_union(first1, last1, first2, last2, result), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // set_union + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> set_union( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Result const& result + ) + { + return sprout::outfit::detail::set_union_impl(first1, last1, first2, last2, result, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_SET_UNION_HPP diff --git a/sprout/algorithm/outfit/sort.hpp b/sprout/algorithm/outfit/sort.hpp new file mode 100644 index 00000000..7e52fa59 --- /dev/null +++ b/sprout/algorithm/outfit/sort.hpp @@ -0,0 +1,66 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_SORT_HPP +#define SPROUT_ALGORITHM_OUTFIT_SORT_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> sort_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::sort(cont, comp), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // sort + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> sort( + Container const& cont, + Compare comp + ) + { + return sprout::outfit::detail::sort_impl(cont, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> sort_impl( + Container const& cont, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::sort(cont), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // sort + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> sort( + Container const& cont + ) + { + return sprout::outfit::detail::sort_impl(cont, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_SORT_HPP diff --git a/sprout/algorithm/outfit/sort_heap.hpp b/sprout/algorithm/outfit/sort_heap.hpp new file mode 100644 index 00000000..fce6f44e --- /dev/null +++ b/sprout/algorithm/outfit/sort_heap.hpp @@ -0,0 +1,66 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_SORT_HEAP_HPP +#define SPROUT_ALGORITHM_OUTFIT_SORT_HEAP_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> sort_heap_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::sort_heap(cont, comp), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // sort_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> sort_heap( + Container const& cont, + Compare comp + ) + { + return sprout::outfit::detail::sort_heap_impl(cont, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> sort_heap_impl( + Container const& cont, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::sort_heap(cont), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // sort_heap + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> sort_heap( + Container const& cont + ) + { + return sprout::outfit::detail::sort_heap_impl(cont, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_SORT_HEAP_HPP diff --git a/sprout/algorithm/outfit/stable_partition.hpp b/sprout/algorithm/outfit/stable_partition.hpp new file mode 100644 index 00000000..946f56e2 --- /dev/null +++ b/sprout/algorithm/outfit/stable_partition.hpp @@ -0,0 +1,41 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_STABLE_PARTITION_HPP +#define SPROUT_ALGORITHM_OUTFIT_STABLE_PARTITION_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> stable_partition_impl( + Container const& cont, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::stable_partition(cont, pred), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // stable_partition + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> stable_partition( + Container const& cont, + Predicate pred + ) + { + return sprout::outfit::detail::stable_partition_impl(cont, pred, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_STABLE_PARTITION_HPP diff --git a/sprout/algorithm/outfit/stable_partition_copy.hpp b/sprout/algorithm/outfit/stable_partition_copy.hpp new file mode 100644 index 00000000..f946ae64 --- /dev/null +++ b/sprout/algorithm/outfit/stable_partition_copy.hpp @@ -0,0 +1,45 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_STABLE_PARTITION_COPY_HPP +#define SPROUT_ALGORITHM_OUTFIT_STABLE_PARTITION_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> stable_partition_copy_impl( + Iterator first, + Iterator last, + Result const& result, + Predicate pred, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::stable_partition_copy(first, last, result, pred), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // stable_partition_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> stable_partition_copy( + Iterator first, + Iterator last, + Result const& result, + Predicate pred + ) + { + return sprout::outfit::detail::stable_partition_copy_impl(first, last, result, pred, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_STABLE_PARTITION_COPY_HPP diff --git a/sprout/algorithm/outfit/stable_sort.hpp b/sprout/algorithm/outfit/stable_sort.hpp new file mode 100644 index 00000000..1e6a8eb9 --- /dev/null +++ b/sprout/algorithm/outfit/stable_sort.hpp @@ -0,0 +1,66 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_STABLE_SORT_HPP +#define SPROUT_ALGORITHM_OUTFIT_STABLE_SORT_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> stable_sort_impl( + Container const& cont, + Compare comp, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::stable_sort(cont, comp), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // stable_sort + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> stable_sort( + Container const& cont, + Compare comp + ) + { + return sprout::outfit::detail::stable_sort_impl(cont, comp, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> stable_sort_impl( + Container const& cont, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::stable_sort(cont), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // stable_sort + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> stable_sort( + Container const& cont + ) + { + return sprout::outfit::detail::stable_sort_impl(cont, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_STABLE_SORT_HPP diff --git a/sprout/algorithm/outfit/swap_element.hpp b/sprout/algorithm/outfit/swap_element.hpp new file mode 100644 index 00000000..a7e76294 --- /dev/null +++ b/sprout/algorithm/outfit/swap_element.hpp @@ -0,0 +1,43 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_SWAP_ELEMENT_HPP +#define SPROUT_ALGORITHM_OUTFIT_SWAP_ELEMENT_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> swap_element_impl( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator pos1, + typename sprout::fixed_container_traits::const_iterator pos2, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::swap_element(cont, pos1, pos2), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // swap_element + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> swap_element( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator pos1, + typename sprout::fixed_container_traits::const_iterator pos2 + ) + { + return sprout::outfit::detail::swap_element_impl(cont, pos1, pos2, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_SWAP_ELEMENT_HPP diff --git a/sprout/algorithm/outfit/swap_element_copy.hpp b/sprout/algorithm/outfit/swap_element_copy.hpp new file mode 100644 index 00000000..672ed17d --- /dev/null +++ b/sprout/algorithm/outfit/swap_element_copy.hpp @@ -0,0 +1,47 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_SWAP_ELEMENT_COPY_HPP +#define SPROUT_ALGORITHM_OUTFIT_SWAP_ELEMENT_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> swap_element_copy_impl( + Iterator first, + Iterator last, + Result const& result, + Iterator pos1, + Iterator pos2, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::swap_element_copy(first, last, result, pos1, pos2), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // swap_element_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> swap_element_copy( + Iterator first, + Iterator last, + Result const& result, + Iterator pos1, + Iterator pos2 + ) + { + return sprout::outfit::detail::swap_element_copy_impl(first, last, result, pos1, pos2, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_SWAP_ELEMENT_COPY_HPP diff --git a/sprout/algorithm/outfit/transform.hpp b/sprout/algorithm/outfit/transform.hpp new file mode 100644 index 00000000..39defa20 --- /dev/null +++ b/sprout/algorithm/outfit/transform.hpp @@ -0,0 +1,78 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_TRANSFORM_HPP +#define SPROUT_ALGORITHM_OUTFIT_TRANSFORM_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> transform_impl( + Iterator first, + Iterator last, + Result const& result, + UnaryOperation op, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::transform(first, last, result, op), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // transform + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> transform( + Iterator first, + Iterator last, + Result const& result, + UnaryOperation op + ) + { + return sprout::outfit::detail::transform_impl(first, last, result, op, sprout::fixed_begin_offset(result)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> transform_impl( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Result const& result, + BinaryOperation op, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::transform(first1, last1, first2, result, op), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // transform + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> transform( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Result const& result, + BinaryOperation op + ) + { + return sprout::outfit::detail::transform_impl(first1, last1, first2, result, op, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_TRANSFORM_HPP diff --git a/sprout/algorithm/outfit/unique.hpp b/sprout/algorithm/outfit/unique.hpp new file mode 100644 index 00000000..337d4d35 --- /dev/null +++ b/sprout/algorithm/outfit/unique.hpp @@ -0,0 +1,66 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_UNIQUE_HPP +#define SPROUT_ALGORITHM_OUTFIT_UNIQUE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique_impl( + Container const& cont, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::unique(cont), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // unique + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique( + Container const& cont + ) + { + return sprout::outfit::detail::unique_impl(cont, sprout::fixed_begin_offset(cont)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique_impl( + Container const& cont, + BinaryPredicate pred, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::unique(cont, pred), + offset, + offset + sprout::size(cont) + ); + } + } // namespace detail + // + // unique + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique( + Container const& cont, + BinaryPredicate pred + ) + { + return sprout::outfit::detail::unique_impl(cont, pred, sprout::fixed_begin_offset(cont)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_UNIQUE_HPP diff --git a/sprout/algorithm/outfit/unique_copy.hpp b/sprout/algorithm/outfit/unique_copy.hpp new file mode 100644 index 00000000..c730a119 --- /dev/null +++ b/sprout/algorithm/outfit/unique_copy.hpp @@ -0,0 +1,74 @@ +#ifndef SPROUT_ALGORITHM_OUTFIT_UNIQUE_COPY_HPP +#define SPROUT_ALGORITHM_OUTFIT_UNIQUE_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace outfit { + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique_copy_impl( + Iterator first, + Iterator last, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::unique_copy(first, last, result), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // unique_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique_copy( + Iterator first, + Iterator last, + Result const& result + ) + { + return sprout::outfit::detail::unique_copy_impl(first, last, result, sprout::fixed_begin_offset(result)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique_copy_impl( + Iterator first, + Iterator last, + Result const& result, + BinaryPredicate pred, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::fixed::unique_copy(first, last, result, pred), + offset, + offset + sprout::size(result) + ); + } + } // namespace detail + // + // unique_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique_copy( + Iterator first, + Iterator last, + Result const& result, + BinaryPredicate pred + ) + { + return sprout::outfit::detail::unique_copy_impl(first, last, result, pred, sprout::fixed_begin_offset(result)); + } + } // namespace outfit +} // namespace sprout + +#endif // #ifndef SPROUT_ALGORITHM_OUTFIT_UNIQUE_COPY_HPP diff --git a/sprout/algorithm/partial_sort.hpp b/sprout/algorithm/partial_sort.hpp new file mode 100644 index 00000000..bc1d8eca --- /dev/null +++ b/sprout/algorithm/partial_sort.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_PARTIAL_SORT_HPP +#define SPROUT_ALGORITHM_PARTIAL_SORT_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_PARTIAL_SORT_HPP diff --git a/sprout/algorithm/partition.hpp b/sprout/algorithm/partition.hpp new file mode 100644 index 00000000..8dd22cbf --- /dev/null +++ b/sprout/algorithm/partition.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_PARTITION_HPP +#define SPROUT_ALGORITHM_PARTITION_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_PARTITION_HPP diff --git a/sprout/algorithm/partition_copy.hpp b/sprout/algorithm/partition_copy.hpp new file mode 100644 index 00000000..c12bb689 --- /dev/null +++ b/sprout/algorithm/partition_copy.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_PARTITION_COPY_HPP +#define SPROUT_ALGORITHM_PARTITION_COPY_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_PARTITION_COPY_HPP diff --git a/sprout/algorithm/pop_heap.hpp b/sprout/algorithm/pop_heap.hpp new file mode 100644 index 00000000..2b233d13 --- /dev/null +++ b/sprout/algorithm/pop_heap.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_POP_HEAP_HPP +#define SPROUT_ALGORITHM_POP_HEAP_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_POP_HEAP_HPP diff --git a/sprout/algorithm/push_heap.hpp b/sprout/algorithm/push_heap.hpp new file mode 100644 index 00000000..5df99e88 --- /dev/null +++ b/sprout/algorithm/push_heap.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_PUSH_HEAP_HPP +#define SPROUT_ALGORITHM_PUSH_HEAP_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_PUSH_HEAP_HPP diff --git a/sprout/algorithm/remove.hpp b/sprout/algorithm/remove.hpp new file mode 100644 index 00000000..124fa697 --- /dev/null +++ b/sprout/algorithm/remove.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_REMOVE_HPP +#define SPROUT_ALGORITHM_REMOVE_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_REMOVE_HPP diff --git a/sprout/algorithm/remove_copy.hpp b/sprout/algorithm/remove_copy.hpp new file mode 100644 index 00000000..83c74ace --- /dev/null +++ b/sprout/algorithm/remove_copy.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_REMOVE_COPY_HPP +#define SPROUT_ALGORITHM_REMOVE_COPY_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_REMOVE_COPY_HPP diff --git a/sprout/algorithm/remove_copy_if.hpp b/sprout/algorithm/remove_copy_if.hpp new file mode 100644 index 00000000..ad005348 --- /dev/null +++ b/sprout/algorithm/remove_copy_if.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_REMOVE_COPY_IF_HPP +#define SPROUT_ALGORITHM_REMOVE_COPY_IF_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_REMOVE_COPY_IF_HPP diff --git a/sprout/algorithm/remove_if.hpp b/sprout/algorithm/remove_if.hpp new file mode 100644 index 00000000..b1a94147 --- /dev/null +++ b/sprout/algorithm/remove_if.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_REMOVE_IF_HPP +#define SPROUT_ALGORITHM_REMOVE_IF_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_REMOVE_IF_HPP diff --git a/sprout/algorithm/replace.hpp b/sprout/algorithm/replace.hpp new file mode 100644 index 00000000..c7d191aa --- /dev/null +++ b/sprout/algorithm/replace.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_REPLACE_HPP +#define SPROUT_ALGORITHM_REPLACE_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_REPLACE_HPP diff --git a/sprout/algorithm/replace_copy.hpp b/sprout/algorithm/replace_copy.hpp new file mode 100644 index 00000000..65016ff8 --- /dev/null +++ b/sprout/algorithm/replace_copy.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_REPLACE_COPY_HPP +#define SPROUT_ALGORITHM_REPLACE_COPY_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_REPLACE_COPY_HPP diff --git a/sprout/algorithm/replace_copy_if.hpp b/sprout/algorithm/replace_copy_if.hpp new file mode 100644 index 00000000..92dd9cab --- /dev/null +++ b/sprout/algorithm/replace_copy_if.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_REPLACE_COPY_IF_HPP +#define SPROUT_ALGORITHM_REPLACE_COPY_IF_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_REPLACE_COPY_IF_HPP diff --git a/sprout/algorithm/replace_if.hpp b/sprout/algorithm/replace_if.hpp new file mode 100644 index 00000000..acccd404 --- /dev/null +++ b/sprout/algorithm/replace_if.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_REPLACE_IF_HPP +#define SPROUT_ALGORITHM_REPLACE_IF_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_REPLACE_IF_HPP diff --git a/sprout/algorithm/reverse.hpp b/sprout/algorithm/reverse.hpp new file mode 100644 index 00000000..76ee0b39 --- /dev/null +++ b/sprout/algorithm/reverse.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_REVERSE_HPP +#define SPROUT_ALGORITHM_REVERSE_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_REVERSE_HPP diff --git a/sprout/algorithm/reverse_copy.hpp b/sprout/algorithm/reverse_copy.hpp new file mode 100644 index 00000000..75ab9822 --- /dev/null +++ b/sprout/algorithm/reverse_copy.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_REVERSE_COPY_HPP +#define SPROUT_ALGORITHM_REVERSE_COPY_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_REVERSE_COPY_HPP diff --git a/sprout/algorithm/rotate.hpp b/sprout/algorithm/rotate.hpp new file mode 100644 index 00000000..2bebab29 --- /dev/null +++ b/sprout/algorithm/rotate.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_ROTATE_HPP +#define SPROUT_ALGORITHM_ROTATE_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_ROTATE_HPP diff --git a/sprout/algorithm/rotate_copy.hpp b/sprout/algorithm/rotate_copy.hpp new file mode 100644 index 00000000..80fee50d --- /dev/null +++ b/sprout/algorithm/rotate_copy.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_ROTATE_COPY_HPP +#define SPROUT_ALGORITHM_ROTATE_COPY_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_ROTATE_COPY_HPP diff --git a/sprout/algorithm/set_difference.hpp b/sprout/algorithm/set_difference.hpp new file mode 100644 index 00000000..7fa18742 --- /dev/null +++ b/sprout/algorithm/set_difference.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_SET_DIFFERENCE_HPP +#define SPROUT_ALGORITHM_SET_DIFFERENCE_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_SET_DIFFERENCE_HPP diff --git a/sprout/algorithm/set_intersection.hpp b/sprout/algorithm/set_intersection.hpp new file mode 100644 index 00000000..3ff211ce --- /dev/null +++ b/sprout/algorithm/set_intersection.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_SET_INTERSECTION_HPP +#define SPROUT_ALGORITHM_SET_INTERSECTION_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_SET_INTERSECTION_HPP diff --git a/sprout/algorithm/set_symmetric_difference.hpp b/sprout/algorithm/set_symmetric_difference.hpp new file mode 100644 index 00000000..eee8c750 --- /dev/null +++ b/sprout/algorithm/set_symmetric_difference.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_SET_SYMMETRIC_DIFFERENCE_HPP +#define SPROUT_ALGORITHM_SET_SYMMETRIC_DIFFERENCE_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_SET_SYMMETRIC_DIFFERENCE_HPP diff --git a/sprout/algorithm/set_union.hpp b/sprout/algorithm/set_union.hpp new file mode 100644 index 00000000..3fa982ff --- /dev/null +++ b/sprout/algorithm/set_union.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_SET_UNION_HPP +#define SPROUT_ALGORITHM_SET_UNION_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_SET_UNION_HPP diff --git a/sprout/algorithm/sort.hpp b/sprout/algorithm/sort.hpp new file mode 100644 index 00000000..3634650b --- /dev/null +++ b/sprout/algorithm/sort.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_SORT_HPP +#define SPROUT_ALGORITHM_SORT_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_SORT_HPP diff --git a/sprout/algorithm/sort_heap.hpp b/sprout/algorithm/sort_heap.hpp new file mode 100644 index 00000000..d66ff0f2 --- /dev/null +++ b/sprout/algorithm/sort_heap.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_SORT_HEAP_HPP +#define SPROUT_ALGORITHM_SORT_HEAP_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_SORT_HEAP_HPP diff --git a/sprout/algorithm/stable_partition.hpp b/sprout/algorithm/stable_partition.hpp new file mode 100644 index 00000000..ae33044b --- /dev/null +++ b/sprout/algorithm/stable_partition.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_STABLE_PARTITION_HPP +#define SPROUT_ALGORITHM_STABLE_PARTITION_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_STABLE_PARTITION_HPP diff --git a/sprout/algorithm/stable_partition_copy.hpp b/sprout/algorithm/stable_partition_copy.hpp new file mode 100644 index 00000000..256bc231 --- /dev/null +++ b/sprout/algorithm/stable_partition_copy.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_STABLE_PARTITION_COPY_HPP +#define SPROUT_ALGORITHM_STABLE_PARTITION_COPY_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_STABLE_PARTITION_COPY_HPP diff --git a/sprout/algorithm/stable_sort.hpp b/sprout/algorithm/stable_sort.hpp new file mode 100644 index 00000000..19ae966f --- /dev/null +++ b/sprout/algorithm/stable_sort.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_STABLE_SORT_HPP +#define SPROUT_ALGORITHM_STABLE_SORT_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_STABLE_SORT_HPP diff --git a/sprout/algorithm/swap_element.hpp b/sprout/algorithm/swap_element.hpp new file mode 100644 index 00000000..b18bdc5c --- /dev/null +++ b/sprout/algorithm/swap_element.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_SWAP_ELEMENT_HPP +#define SPROUT_ALGORITHM_SWAP_ELEMENT_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_SWAP_ELEMENT_HPP diff --git a/sprout/algorithm/swap_element_copy.hpp b/sprout/algorithm/swap_element_copy.hpp new file mode 100644 index 00000000..6139b9c5 --- /dev/null +++ b/sprout/algorithm/swap_element_copy.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_SWAP_ELEMENT_COPY_HPP +#define SPROUT_ALGORITHM_SWAP_ELEMENT_COPY_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_SWAP_ELEMENT_COPY_HPP diff --git a/sprout/algorithm/transform.hpp b/sprout/algorithm/transform.hpp new file mode 100644 index 00000000..1595382c --- /dev/null +++ b/sprout/algorithm/transform.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_TRANSFORM_HPP +#define SPROUT_ALGORITHM_TRANSFORM_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_TRANSFORM_HPP diff --git a/sprout/algorithm/unique.hpp b/sprout/algorithm/unique.hpp new file mode 100644 index 00000000..b2c437e9 --- /dev/null +++ b/sprout/algorithm/unique.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_UNIQUE_HPP +#define SPROUT_ALGORITHM_UNIQUE_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_UNIQUE_HPP diff --git a/sprout/algorithm/unique_copy.hpp b/sprout/algorithm/unique_copy.hpp new file mode 100644 index 00000000..bcb3580d --- /dev/null +++ b/sprout/algorithm/unique_copy.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_ALGORITHM_UNIQUE_COPY_HPP +#define SPROUT_ALGORITHM_UNIQUE_COPY_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_ALGORITHM_UNIQUE_COPY_HPP diff --git a/sprout/array.hpp b/sprout/array.hpp new file mode 100644 index 00000000..48281d7b --- /dev/null +++ b/sprout/array.hpp @@ -0,0 +1,261 @@ +#ifndef SPROUT_ARRAY_HPP +#define SPROUT_ARRAY_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + // + // array + // + template + class array { + public: + typedef T value_type; + typedef T* iterator; + typedef T const* const_iterator; + typedef T& reference; + typedef T const& const_reference; + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + typedef T* pointer; + typedef T const* const_pointer; + typedef sprout::detail::reverse_iterator reverse_iterator; + typedef sprout::detail::reverse_iterator const_reverse_iterator; + public: + static constexpr size_type static_size = N; + static constexpr size_type fixed_size = static_size; + public: + T elems[N ? N : 1]; + public: + SPROUT_CONSTEXPR size_type size() const SPROUT_NOEXCEPT { + return N; + } + SPROUT_CONSTEXPR bool empty() const SPROUT_NOEXCEPT { + return N != 0; + } + SPROUT_CONSTEXPR size_type max_size() const SPROUT_NOEXCEPT { + return size(); + } + void rangecheck(size_type i) const { + if (i >= size()) { + throw std::out_of_range("array<>: index out of range"); + } + } + iterator begin() SPROUT_NOEXCEPT { + return elems; + } + SPROUT_CONSTEXPR const_iterator begin() const SPROUT_NOEXCEPT { + return elems; + } + SPROUT_CONSTEXPR const_iterator cbegin() const SPROUT_NOEXCEPT { + return elems; + } + iterator end() SPROUT_NOEXCEPT { + return elems + size(); + } + SPROUT_CONSTEXPR const_iterator end() const SPROUT_NOEXCEPT { + return elems + size(); + } + SPROUT_CONSTEXPR const_iterator cend() const SPROUT_NOEXCEPT { + return elems + size(); + } + reverse_iterator rbegin() SPROUT_NOEXCEPT { + return reverse_iterator(begin()); + } + SPROUT_CONSTEXPR const_reverse_iterator rbegin() const SPROUT_NOEXCEPT { + return const_reverse_iterator(begin()); + } + SPROUT_CONSTEXPR const_reverse_iterator crbegin() const SPROUT_NOEXCEPT { + return const_reverse_iterator(begin()); + } + reverse_iterator rend() SPROUT_NOEXCEPT { + return reverse_iterator(end()); + } + SPROUT_CONSTEXPR const_reverse_iterator rend() const SPROUT_NOEXCEPT { + return const_reverse_iterator(end()); + } + SPROUT_CONSTEXPR const_reverse_iterator crend() const SPROUT_NOEXCEPT { + return const_reverse_iterator(end()); + } + reference operator[](size_type i) { + return elems[i]; + } + SPROUT_CONSTEXPR const_reference operator[](size_type i) const { + return elems[i]; + } + reference at(size_type i) { + rangecheck(i); + return elems[i]; + } + const_reference at(size_type i) const { + rangecheck(i); + return elems[i]; + } + reference front() { + return elems[0]; + } + SPROUT_CONSTEXPR const_reference front() const { + return elems[size() - 1]; + } + reference back() { + return elems[size() - 1]; + } + SPROUT_CONSTEXPR const_reference back() const { + return elems[0]; + } + pointer data() SPROUT_NOEXCEPT { + return elems; + } + SPROUT_CONSTEXPR const_pointer data() const SPROUT_NOEXCEPT { + return elems; + } + pointer c_array() SPROUT_NOEXCEPT { + return elems; + } + void assign(const_reference value) { + fill(value); + } + void fill(const_reference value) { + std::fill_n(begin(), size(), value); + } + void swap(array& other) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(std::swap(std::declval(), std::declval()))) { + std::swap_ranges(other.begin(), other.end(), begin()); + } + template + array& operator=(array const& rhs) { + std::copy(rhs.begin(), rhs.end(), begin()); + return *this; + } + template + array& operator=(array&& rhs) { + std::move(rhs.begin(), rhs.end(), begin()); + return *this; + } + }; + template + SPROUT_CONSTEXPR inline bool operator==(sprout::array const& lhs, sprout::array const& rhs) { + return NS_SSCRISK_CEL_OR_SPROUT_DETAIL::equal(lhs.begin(), lhs.end(), rhs.begin()); + } + template + SPROUT_CONSTEXPR inline bool operator!=(sprout::array const& lhs, sprout::array const& rhs) { + return !(lhs == rhs); + } + template + SPROUT_CONSTEXPR inline bool operator<(sprout::array const& lhs, sprout::array const& rhs) { + return NS_SSCRISK_CEL_OR_SPROUT_DETAIL::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end()); + } + template + SPROUT_CONSTEXPR inline bool operator>(sprout::array const& lhs, sprout::array const& rhs) { + return rhs < lhs; + } + template + SPROUT_CONSTEXPR inline bool operator<=(sprout::array const& lhs, sprout::array const& rhs) { + return !(rhs < lhs); + } + template + SPROUT_CONSTEXPR inline bool operator>=(sprout::array const& lhs, sprout::array const& rhs) { + return !(lhs < rhs); + } + + // + // swap + // + template + SPROUT_CONSTEXPR inline void swap(sprout::array& lhs, sprout::array& rhs) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(lhs.swap(rhs))) { + lhs.swap(rhs); + } + + // + // rebind_fixed_size + // + template + struct rebind_fixed_size > { + public: + template >::size_type S> + struct apply { + public: + typedef sprout::array type; + }; + }; + + // + // make_array + // + template + SPROUT_CONSTEXPR inline sprout::array make_array(T&& head, Tail&&... tail) { + return sprout::array{std::forward(head), std::forward(tail)...}; + } + template + SPROUT_CONSTEXPR inline sprout::array make_array() { + return sprout::array{}; + } + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::array to_array_impl( + T const (& arr)[N], + sprout::index_tuple + ) + { + return sprout::array{arr[Indexes]...}; + } + } // namespace detail + // + // to_array + // + template + SPROUT_CONSTEXPR inline sprout::array to_array(T const (& arr)[N]) { + return sprout::detail::to_array_impl(arr, typename sprout::index_range<0, N>::type()); + } +} // namespace sprout + +namespace std { + // + // tuple_size + // + template + struct tuple_size > { + public: + typedef std::integral_constant type; + static constexpr std::size_t value = type::value; + }; + + // + // tuple_element + // + template + struct tuple_element > { + public: + static_assert(I < N, "tuple_element<>: index out of range"); + typedef T type; + }; + + // + // get + // + template + T& get(sprout::array& arr) SPROUT_NOEXCEPT { + static_assert(I < N, "tuple_element<>: index out of range"); + return arr[I]; + } + template + SPROUT_CONSTEXPR T const& get(sprout::array const& arr) SPROUT_NOEXCEPT { + static_assert(I < N, "tuple_element<>: index out of range"); + return arr[I]; + } + template + T&& get(sprout::array&& arr) SPROUT_NOEXCEPT { + return std::move(get(arr)); + } +} // namespace std + +#endif // #ifndef SPROUT_ARRAY_HPP diff --git a/sprout/config.hpp b/sprout/config.hpp new file mode 100644 index 00000000..4846bfd4 --- /dev/null +++ b/sprout/config.hpp @@ -0,0 +1,30 @@ +#ifndef SPROUT_CONFIG_HPP +#define SPROUT_CONFIG_HPP + +#ifndef SPROUT_CONFIG_DISABLE_CONSTEXPR +# define SPROUT_CONSTEXPR constexpr +#else // #ifndef SPROUT_CONFIG_DISABLE_CONSTEXPR +# define SPROUT_CONSTEXPR +#endif // #ifndef SPROUT_CONFIG_DISABLE_CONSTEXPR + +#ifndef SPROUT_CONFIG_DISABLE_NOEXCEPT +# define SPROUT_NOEXCEPT noexcept +# define SPROUT_NOEXCEPT_EXPR(EXPR) noexcept(EXPR) +#else // #ifndef SPROUT_CONFIG_DISABLE_NOEXCEPT +# define SPROUT_NOEXCEPT +# define SPROUT_NOEXCEPT_EXPR(EXPR) +#endif // #ifndef SPROUT_CONFIG_DISABLE_NOEXCEPT + +#ifndef SPROUT_CONFIG_USE_SSCRISK_CEL +# define HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL +# define HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +# define HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL +# define NS_SSCRISK_CEL_OR_SPROUT_DETAIL sprout::detail +#else // #ifndef SPROUT_CONFIG_USE_SSCRISK_CEL +# define HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL +# define HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +# define HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL +# define NS_SSCRISK_CEL_OR_SPROUT_DETAIL sscrisk::cel +#endif // #ifndef SPROUT_CONFIG_USE_SSCRISK_CEL + +#endif // #ifndef SPROUT_CONFIG_HPP diff --git a/sprout/detail/algorithm.hpp b/sprout/detail/algorithm.hpp new file mode 100644 index 00000000..e7b36f32 --- /dev/null +++ b/sprout/detail/algorithm.hpp @@ -0,0 +1,131 @@ +#ifndef SPROUT_DETAIL_ALGORITHM_HPP +#define SPROUT_DETAIL_ALGORITHM_HPP + +#include +#include + +namespace sprout { + namespace detail { + // + // min + // + template + SPROUT_CONSTEXPR T const& min(T const& a, T const& b) { + return b < a ? b : a; + } + template + SPROUT_CONSTEXPR T const& min(T const& a, T const& b, Compare comp) { + return comp(b, a) ? b : a; + } + + // + // max + // + template + SPROUT_CONSTEXPR T const& max(T const& a, T const& b) { + return a < b ? b : a; + } + template + SPROUT_CONSTEXPR T const& max(T const& a, T const& b, Compare comp) { + return comp(a, b) ? b : a; + } + + // + // count + // + template + SPROUT_CONSTEXPR typename std::iterator_traits::difference_type count( + Iterator first, + Iterator last, + T const & value + ) + { + return first == last + ? 0 + : (*first == value ? 1 : 0) + sprout::detail::count(first + 1, last, value) + ; + } + + // + // count_if + // + template + SPROUT_CONSTEXPR typename std::iterator_traits::difference_type count_if( + Iterator first, + Iterator last, + Predicate pred + ) + { + return first == last + ? 0 + : (pred(*first) ? 1 : 0) + sprout::detail::count_if(first + 1, last, pred); + } + + // + // equal + // + template + SPROUT_CONSTEXPR bool equal( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2 + ) + { + return first1 == last1 + ? true + : *first1 == *first2 && sprout::detail::equal(first1 + 1, last1, first2 + 1) + ; + } + template + SPROUT_CONSTEXPR bool equal( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Predicate pred + ) + { + return first1 == last1 + ? true + : pred(*first1, *first2) && sprout::detail::equal(first1 + 1, last1, first2 + 1, pred); + } + + // + // lexicographical_compare + // + template + SPROUT_CONSTEXPR bool lexicographical_compare( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2 + ) + { + return first2 == last2 + ? false + : first1 == last1 || *first1 < *first2 + ? true + : *first2 < *first1 + ? false + : sprout::detail::lexicographical_compare(first1 + 1, last1, first2 + 1, last2); + } + template + SPROUT_CONSTEXPR bool lexicographical_compare( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Compare comp + ) + { + return first2 == last2 + ? false + : first1 == last1 || comp(*first1, *first2) + ? true + : comp(*first2, *first1) + ? false + : sprout::detail::lexicographical_compare(first1 + 1, last1, first2 + 1, last2, comp); + } + } // namespace detail +} // namespace sprout + +#endif // #ifndef SPROUT_DETAIL_ALGORITHM_HPP diff --git a/sprout/detail/functional.hpp b/sprout/detail/functional.hpp new file mode 100644 index 00000000..4f66da6e --- /dev/null +++ b/sprout/detail/functional.hpp @@ -0,0 +1,24 @@ +#ifndef SPROUT_DETAIL_FUNCTIONAL_HPP +#define SPROUT_DETAIL_FUNCTIONAL_HPP + +#include +#include + +namespace sprout { + namespace detail { + // + // less + // + template + class less + : public std::binary_function + { + public: + SPROUT_CONSTEXPR bool operator()(T const& lhs, T const& rhs) const { + return lhs < rhs; + } + }; + } // namespace detail +} // namespace sprout + +#endif // #ifndef SPROUT_DETAIL_FUNCTIONAL_HPP diff --git a/sprout/detail/if.hpp b/sprout/detail/if.hpp new file mode 100644 index 00000000..0c6725ea --- /dev/null +++ b/sprout/detail/if.hpp @@ -0,0 +1,30 @@ +#ifndef SPROUT_DETAIL_IF_HPP +#define SPROUT_DETAIL_IF_HPP + +#include + +namespace sprout { + namespace detail { + // + // if_c + // + template + struct if_c { + typedef T1 type; + }; + template + struct if_c { + typedef T2 type; + }; + + // + // if_ + // + template + struct if_ + : public sprout::detail::if_c + {}; + } // namespace detail +} // namespace sprout + +#endif // #ifndef SPROUT_DETAIL_IF_HPP diff --git a/sprout/detail/iterator.hpp b/sprout/detail/iterator.hpp new file mode 100644 index 00000000..f7dbff16 --- /dev/null +++ b/sprout/detail/iterator.hpp @@ -0,0 +1,182 @@ +#ifndef SPROUT_DETAIL_ITERATOR_HPP +#define SPROUT_DETAIL_ITERATOR_HPP + +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace detail { + // + // distance + // + template + SPROUT_CONSTEXPR typename std::iterator_traits::difference_type distance( + Iterator first, + Iterator last + ) + { + return first == last ? 0 : 1 + sprout::detail::distance(first + 1, last); + } + + template + SPROUT_CONSTEXPR typename std::iterator_traits::difference_type bidirectional_distance_impl( + Iterator first1, + Iterator first2, + Iterator last, + typename std::iterator_traits::difference_type current = 1 + ) + { + return first1 == last + ? current + : first2 == last + ? -current + : sprout::detail::bidirectional_distance_impl(first1 + 1, first2 - 1, last, current + 1) + ; + } + // + // bidirectional_distance + // + template + SPROUT_CONSTEXPR typename std::iterator_traits::difference_type bidirectional_distance( + Iterator first, + Iterator last + ) + { + return first == last ? 0 : sprout::detail::bidirectional_distance_impl(first + 1, first - 1, last); + } + + // + // reverse_iterator + // + template + class reverse_iterator + : public std::iterator< + typename std::iterator_traits::iterator_category, + typename std::iterator_traits::value_type, + typename std::iterator_traits::difference_type, + typename std::iterator_traits::pointer, + typename std::iterator_traits::reference + > + { + public: + typedef Iterator iterator_type; + typedef typename std::iterator_traits::iterator_category iterator_category; + typedef typename std::iterator_traits::value_type value_type; + typedef typename std::iterator_traits::difference_type difference_type; + typedef typename std::iterator_traits::pointer pointer; + typedef typename std::iterator_traits::reference reference; + protected: + iterator_type current; + private: + iterator_type deref_tmp; + public: + reverse_iterator() = default; + reverse_iterator(reverse_iterator const&) = default; + SPROUT_CONSTEXPR explicit reverse_iterator(iterator_type it) + : current(it) + , deref_tmp(current - 1) + {} + template + SPROUT_CONSTEXPR reverse_iterator(reverse_iterator const& it) + : current(it) + , deref_tmp(current - 1) + {} + template + reverse_iterator& operator=(const reverse_iterator& it) { + reverse_iterator temp(it); + temp.swap(this); + return this; + } + SPROUT_CONSTEXPR iterator_type base() const { + return current; + } + SPROUT_CONSTEXPR reference operator*() const { + return *deref_tmp; + } + SPROUT_CONSTEXPR pointer operator->() const { + return &*deref_tmp; + } + reverse_iterator& operator++() { + --current; + --deref_tmp; + return this; + } + reverse_iterator operator++(int) { + reverse_iterator result(this); + --current; + --deref_tmp; + return result; + } + reverse_iterator& operator--() { + ++current; + ++deref_tmp; + return this; + } + reverse_iterator operator--(int) { + reverse_iterator temp(this); + ++current; + ++deref_tmp; + return temp; + } + SPROUT_CONSTEXPR reverse_iterator operator+(difference_type n) const { + return reverse_iterator(current - n); + } + SPROUT_CONSTEXPR reverse_iterator operator-(difference_type n) const { + return reverse_iterator(current + n); + } + reverse_iterator& operator+=(difference_type n) { + reverse_iterator temp(current - n); + temp.swap(this); + return this; + } + reverse_iterator& operator-=(difference_type n) { + reverse_iterator temp(current + n); + temp.swap(this); + return this; + } + SPROUT_CONSTEXPR reference operator[](difference_type n) const { + return *(deref_tmp - n); + } + void swap(reverse_iterator& other) { + using std::swap; + swap(current, other.current); + swap(deref_tmp, other.deref_tmp); + } + }; + template + SPROUT_CONSTEXPR bool operator==( + sprout::detail::reverse_iterator const& lhs, + sprout::detail::reverse_iterator const& rhs + ) + { + return lhs.base() == rhs.base(); + } + template + SPROUT_CONSTEXPR bool operator!=( + sprout::detail::reverse_iterator const& lhs, + sprout::detail::reverse_iterator const& rhs + ) + { + return !(lhs == rhs); + } + template + SPROUT_CONSTEXPR sprout::detail::reverse_iterator operator+( + typename sprout::detail::reverse_iterator::difference_type n, + sprout::detail::reverse_iterator const& it + ) + { + return it + n; + } + + // + // swap + // + template + void swap(sprout::detail::reverse_iterator& lhs, sprout::detail::reverse_iterator& rhs) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(lhs.swap(rhs))) { + lhs.swap(rhs); + } + } // namespace detail +} // namespace sprout + +#endif // #ifndef SPROUT_DETAIL_ITERATOR_HPP diff --git a/sprout/detail/overlap_count.hpp b/sprout/detail/overlap_count.hpp new file mode 100644 index 00000000..485a5bc6 --- /dev/null +++ b/sprout/detail/overlap_count.hpp @@ -0,0 +1,72 @@ +#ifndef SPROUT_DETAIL_OVERLAP_COUNT_HPP +#define SPROUT_DETAIL_OVERLAP_COUNT_HPP + +#include +#include + +namespace sprout { + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::iterator_traits::difference_type overlap_count_impl( + Iterator first, + Iterator last, + typename std::iterator_traits::value_type const& value, + typename std::iterator_traits::difference_type current = 0 + ) + { + return first == last + ? 0 + : *first == value + ? 1 + sprout::detail::overlap_count_impl(first + 1, last, value) + : sprout::detail::overlap_count_impl(first + 1, last, *first) + ; + } + // + // overlap_count + // + template + SPROUT_CONSTEXPR inline typename std::iterator_traits::difference_type overlap_count( + Iterator first, + Iterator last + ) + { + return first == last + ? 0 + : sprout::detail::overlap_count_impl(first + 1, last, *first) + ; + } + + template + SPROUT_CONSTEXPR inline typename std::iterator_traits::difference_type overlap_count_impl( + Iterator first, + Iterator last, + Predicate pred, + typename std::iterator_traits::value_type const& value + ) + { + return first == last + ? 0 + : pred(*first, value) + ? 1 + sprout::detail::overlap_count_impl(first + 1, last, pred, value) + : sprout::detail::overlap_count_impl(first + 1, last, pred, *first) + ; + } + // + // overlap_count + // + template + SPROUT_CONSTEXPR inline typename std::iterator_traits::difference_type overlap_count( + Iterator first, + Iterator last, + Predicate pred + ) + { + return first == last + ? 0 + : sprout::detail::overlap_count_impl(first + 1, last, pred, *first) + ; + } + } // namespace detail +} // namespace sprout + +#endif // #ifndef SPROUT_DETAIL_OVERLAP_COUNT_HPP diff --git a/sprout/detail/overlap_count_2.hpp b/sprout/detail/overlap_count_2.hpp new file mode 100644 index 00000000..0372bac3 --- /dev/null +++ b/sprout/detail/overlap_count_2.hpp @@ -0,0 +1,53 @@ +#ifndef SPROUT_DETAIL_OVERLAP_COUNT_2_HPP +#define SPROUT_DETAIL_OVERLAP_COUNT_2_HPP + +#include +#include + +namespace sprout { + namespace detail { + // + // overlap_count_2 + // + template + SPROUT_CONSTEXPR inline typename std::iterator_traits::difference_type overlap_count_2( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2, + Compare comp + ) + { + return first1 != last1 && first2 != last2 + ? comp(*first1, *first2) + ? sprout::detail::overlap_count_2(first1 + 1, last1, first2, last2, comp) + : comp(*first2, *first1) + ? sprout::detail::overlap_count_2(first1, last1, first2 + 1, last2, comp) + : 1 + sprout::detail::overlap_count_2(first1 + 1, last1, first2 + 1, last2, comp) + : 0 + ; + } + // + // overlap_count_2 + // + template + SPROUT_CONSTEXPR inline typename std::iterator_traits::difference_type overlap_count_2( + Iterator1 first1, + Iterator1 last1, + Iterator2 first2, + Iterator2 last2 + ) + { + return first1 != last1 && first2 != last2 + ? *first1 < *first2 + ? sprout::detail::overlap_count_2(first1 + 1, last1, first2, last2) + : *first2 < *first1 + ? sprout::detail::overlap_count_2(first1, last1, first2 + 1, last2) + : 1 + sprout::detail::overlap_count_2(first1 + 1, last1, first2 + 1, last2) + : 0 + ; + } + } // namespace detail +} // namespace sprout + +#endif // #ifndef SPROUT_DETAIL_OVERLAP_COUNT_2_HPP diff --git a/sprout/detail/param_at.hpp b/sprout/detail/param_at.hpp new file mode 100644 index 00000000..533884b8 --- /dev/null +++ b/sprout/detail/param_at.hpp @@ -0,0 +1,37 @@ +#ifndef SPROUT_DETAIL_PARAM_AT_HPP +#define SPROUT_DETAIL_PARAM_AT_HPP + +#include +#include +#include + +namespace sprout { + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sizeof...(Values) == 0, + R + >::type param_at( + std::size_t n, + T const& v, + Values const&... values + ) + { + return v; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sizeof...(Values) != 0, + R + >::type param_at( + std::size_t n, + T const& v, + Values const&... values + ) + { + return n == 0 ? v : sprout::detail::param_at(n - 1, values...); + } + } // namespace detail +} // namespace sprout + +#endif // #ifndef SPROUT_DETAIL_PARAM_AT_HPP diff --git a/sprout/fixed_container.hpp b/sprout/fixed_container.hpp new file mode 100644 index 00000000..ae09bf53 --- /dev/null +++ b/sprout/fixed_container.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_FIXED_CONTAINER_HPP +#define SPROUT_FIXED_CONTAINER_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_FIXED_CONTAINER_HPP diff --git a/sprout/fixed_container/begin.hpp b/sprout/fixed_container/begin.hpp new file mode 100644 index 00000000..31300e26 --- /dev/null +++ b/sprout/fixed_container/begin.hpp @@ -0,0 +1,45 @@ +#ifndef SPROUT_FIXED_CONTAINER_BEGIN_HPP +#define SPROUT_FIXED_CONTAINER_BEGIN_HPP + +#include +#include +#include + +namespace sprout { + // + // begin + // + template + typename sprout::fixed_container_traits::iterator begin(Range& range) { + return range.begin(); + } + template + typename sprout::fixed_container_traits::iterator begin(T (& arr)[N]) { + return arr; + } + // + // begin + // + template + SPROUT_CONSTEXPR typename sprout::fixed_container_traits::const_iterator begin(Range const& range) { + return range.begin(); + } + template + SPROUT_CONSTEXPR typename sprout::fixed_container_traits::const_iterator begin(T const (& arr)[N]) { + return arr; + } + + // + // cbegin + // + template + SPROUT_CONSTEXPR typename sprout::fixed_container_traits::const_iterator cbegin(Range const& range) { + return range.begin(); + } + template + SPROUT_CONSTEXPR typename sprout::fixed_container_traits::const_iterator cbegin(T const (& arr)[N]) { + return arr; + } +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_BEGIN_HPP diff --git a/sprout/fixed_container/const_iterator.hpp b/sprout/fixed_container/const_iterator.hpp new file mode 100644 index 00000000..9cb646e7 --- /dev/null +++ b/sprout/fixed_container/const_iterator.hpp @@ -0,0 +1,18 @@ +#ifndef SPROUT_FIXED_CONTAINER_CONST_ITERATOR_HPP +#define SPROUT_FIXED_CONTAINER_CONST_ITERATOR_HPP + +#include +#include + +namespace sprout { + // + // fixed_const_iterator + // + template + struct fixed_const_iterator { + public: + typedef typename sprout::fixed_container_traits::const_iterator type; + }; +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_CONST_ITERATOR_HPP diff --git a/sprout/fixed_container/const_pointer.hpp b/sprout/fixed_container/const_pointer.hpp new file mode 100644 index 00000000..6dba0e78 --- /dev/null +++ b/sprout/fixed_container/const_pointer.hpp @@ -0,0 +1,18 @@ +#ifndef SPROUT_FIXED_CONTAINER_CONST_POINTER_HPP +#define SPROUT_FIXED_CONTAINER_CONST_POINTER_HPP + +#include +#include + +namespace sprout { + // + // fixed_const_pointer + // + template + struct fixed_const_pointer { + public: + typedef typename sprout::fixed_container_traits::const_pointer type; + }; +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_CONST_POINTER_HPP diff --git a/sprout/fixed_container/const_reference.hpp b/sprout/fixed_container/const_reference.hpp new file mode 100644 index 00000000..92023226 --- /dev/null +++ b/sprout/fixed_container/const_reference.hpp @@ -0,0 +1,18 @@ +#ifndef SPROUT_FIXED_CONTAINER_CONST_REFERENCE_HPP +#define SPROUT_FIXED_CONTAINER_CONST_REFERENCE_HPP + +#include +#include + +namespace sprout { + // + // fixed_const_reference + // + template + struct fixed_const_reference { + public: + typedef typename sprout::fixed_container_traits::const_reference type; + }; +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_CONST_REFERENCE_HPP diff --git a/sprout/fixed_container/difference_type.hpp b/sprout/fixed_container/difference_type.hpp new file mode 100644 index 00000000..b0c6cba2 --- /dev/null +++ b/sprout/fixed_container/difference_type.hpp @@ -0,0 +1,18 @@ +#ifndef SPROUT_FIXED_CONTAINER_DIFFERENCE_TYPE_HPP +#define SPROUT_FIXED_CONTAINER_DIFFERENCE_TYPE_HPP + +#include +#include + +namespace sprout { + // + // fixed_difference_type + // + template + struct fixed_difference_type { + public: + typedef typename sprout::fixed_container_traits::difference_type type; + }; +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_DIFFERENCE_TYPE_HPP diff --git a/sprout/fixed_container/empty.hpp b/sprout/fixed_container/empty.hpp new file mode 100644 index 00000000..d75f75eb --- /dev/null +++ b/sprout/fixed_container/empty.hpp @@ -0,0 +1,18 @@ +#ifndef SPROUT_FIXED_CONTAINER_EMPTY_HPP +#define SPROUT_FIXED_CONTAINER_EMPTY_HPP + +#include +#include +#include + +namespace sprout { + // + // empty + // + template + SPROUT_CONSTEXPR bool empty(Range const& range) { + return sprout::size(range) == 0; + } +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_EMPTY_HPP diff --git a/sprout/fixed_container/end.hpp b/sprout/fixed_container/end.hpp new file mode 100644 index 00000000..8df3a935 --- /dev/null +++ b/sprout/fixed_container/end.hpp @@ -0,0 +1,45 @@ +#ifndef SPROUT_FIXED_CONTAINER_END_HPP +#define SPROUT_FIXED_CONTAINER_END_HPP + +#include +#include +#include + +namespace sprout { + // + // end + // + template + typename sprout::fixed_container_traits::iterator end(Range& range) { + return range.end(); + } + template + typename sprout::fixed_container_traits::iterator end(T (& arr)[N]) { + return arr + N; + } + // + // end + // + template + SPROUT_CONSTEXPR typename sprout::fixed_container_traits::const_iterator end(Range const& range) { + return range.end(); + } + template + SPROUT_CONSTEXPR typename sprout::fixed_container_traits::const_iterator end(T const (& arr)[N]) { + return arr + N; + } + + // + // cend + // + template + SPROUT_CONSTEXPR typename sprout::fixed_container_traits::const_iterator cend(Range const& range) { + return range.end(); + } + template + SPROUT_CONSTEXPR typename sprout::fixed_container_traits::const_iterator cend(T const (& arr)[N]) { + return arr + N; + } +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_END_HPP diff --git a/sprout/fixed_container/fixed_begin.hpp b/sprout/fixed_container/fixed_begin.hpp new file mode 100644 index 00000000..1a1c94b2 --- /dev/null +++ b/sprout/fixed_container/fixed_begin.hpp @@ -0,0 +1,37 @@ +#ifndef SPROUT_FIXED_CONTAINER_FIXED_BEGIN_HPP +#define SPROUT_FIXED_CONTAINER_FIXED_BEGIN_HPP + +#include +#include +#include +#include + +namespace sprout { + // + // fixed_begin + // + template + typename sprout::fixed_container_traits< + typename sprout::fixed_container_traits::fixed_container_type + >::iterator fixed_begin(Range& range) { + return sprout::begin(sprout::get_fixed(range)); + } + template + SPROUT_CONSTEXPR typename sprout::fixed_container_traits< + typename sprout::fixed_container_traits::fixed_container_type + >::const_iterator fixed_begin(Range const& range) { + return sprout::begin(sprout::get_fixed(range)); + } + + // + // fixed_cbegin + // + template + SPROUT_CONSTEXPR typename sprout::fixed_container_traits< + typename sprout::fixed_container_traits::fixed_container_type + >::const_iterator fixed_cbegin(Range const& range) { + return sprout::begin(sprout::get_fixed(range)); + } +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_FIXED_BEGIN_HPP diff --git a/sprout/fixed_container/fixed_begin_offset.hpp b/sprout/fixed_container/fixed_begin_offset.hpp new file mode 100644 index 00000000..e4cdb89c --- /dev/null +++ b/sprout/fixed_container/fixed_begin_offset.hpp @@ -0,0 +1,20 @@ +#ifndef SPROUT_FIXED_CONTAINER_FIXED_BEGIN_OFFSET_HPP +#define SPROUT_FIXED_CONTAINER_FIXED_BEGIN_OFFSET_HPP + +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + // + // fixed_begin_offset + // + template + SPROUT_CONSTEXPR typename sprout::fixed_container_traits::difference_type fixed_begin_offset(Range const& range) { + return NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::fixed_begin(range), sprout::begin(range)); + } +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_FIXED_BEGIN_OFFSET_HPP diff --git a/sprout/fixed_container/fixed_container_type.hpp b/sprout/fixed_container/fixed_container_type.hpp new file mode 100644 index 00000000..f0509c51 --- /dev/null +++ b/sprout/fixed_container/fixed_container_type.hpp @@ -0,0 +1,18 @@ +#ifndef SPROUT_FIXED_CONTAINER_FIXED_CONTAINER_TYPE_HPP +#define SPROUT_FIXED_CONTAINER_FIXED_CONTAINER_TYPE_HPP + +#include +#include + +namespace sprout { + // + // fixed_container_type + // + template + struct fixed_container_type { + public: + typedef typename sprout::fixed_container_traits::fixed_container_type type; + }; +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_FIXED_CONTAINER_TYPE_HPP diff --git a/sprout/fixed_container/fixed_end.hpp b/sprout/fixed_container/fixed_end.hpp new file mode 100644 index 00000000..901f6415 --- /dev/null +++ b/sprout/fixed_container/fixed_end.hpp @@ -0,0 +1,37 @@ +#ifndef SPROUT_FIXED_CONTAINER_FIXED_END_HPP +#define SPROUT_FIXED_CONTAINER_FIXED_END_HPP + +#include +#include +#include +#include + +namespace sprout { + // + // fixed_end + // + template + typename sprout::fixed_container_traits< + typename sprout::fixed_container_traits::fixed_container_type + >::iterator fixed_end(Range& range) { + return sprout::end(sprout::get_fixed(range)); + } + template + SPROUT_CONSTEXPR typename sprout::fixed_container_traits< + typename sprout::fixed_container_traits::fixed_container_type + >::const_iterator fixed_end(Range const& range) { + return sprout::end(sprout::get_fixed(range)); + } + + // + // fixed_cend + // + template + SPROUT_CONSTEXPR typename sprout::fixed_container_traits< + typename sprout::fixed_container_traits::fixed_container_type + >::const_iterator fixed_cend(Range const& range) { + return sprout::end(sprout::get_fixed(range)); + } +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_FIXED_END_HPP diff --git a/sprout/fixed_container/fixed_end_offset.hpp b/sprout/fixed_container/fixed_end_offset.hpp new file mode 100644 index 00000000..3d692311 --- /dev/null +++ b/sprout/fixed_container/fixed_end_offset.hpp @@ -0,0 +1,20 @@ +#ifndef SPROUT_FIXED_CONTAINER_FIXED_END_OFFSET_HPP +#define SPROUT_FIXED_CONTAINER_FIXED_END_OFFSET_HPP + +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + // + // fixed_end_offset + // + template + SPROUT_CONSTEXPR typename sprout::fixed_container_traits::difference_type fixed_end_offset(Range const& range) { + return NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::fixed_begin(range), sprout::end(range)); + } +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_FIXED_END_OFFSET_HPP diff --git a/sprout/fixed_container/fixed_size.hpp b/sprout/fixed_container/fixed_size.hpp new file mode 100644 index 00000000..9bbd190b --- /dev/null +++ b/sprout/fixed_container/fixed_size.hpp @@ -0,0 +1,22 @@ +#ifndef SPROUT_FIXED_CONTAINER_FIXED_SIZE_HPP +#define SPROUT_FIXED_CONTAINER_FIXED_SIZE_HPP + +#include +#include +#include + +namespace sprout { + // + // fixed_size + // + template + struct fixed_size { + public: + typedef typename sprout::fixed_container_traits::size_type value + = sprout::fixed_container_traits::fixed_size + ; + typedef std::integral_constant::size_type, value> type; + }; +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_FIXED_SIZE_HPP diff --git a/sprout/fixed_container/functions.hpp b/sprout/fixed_container/functions.hpp new file mode 100644 index 00000000..37c835dd --- /dev/null +++ b/sprout/fixed_container/functions.hpp @@ -0,0 +1,15 @@ +#ifndef SPROUT_FIXED_CONTAINER_FUNCTIONS_HPP +#define SPROUT_FIXED_CONTAINER_FUNCTIONS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif // #ifndef SPROUT_FIXED_CONTAINER_FUNCTIONS_HPP diff --git a/sprout/fixed_container/get_fixed.hpp b/sprout/fixed_container/get_fixed.hpp new file mode 100644 index 00000000..f720ac40 --- /dev/null +++ b/sprout/fixed_container/get_fixed.hpp @@ -0,0 +1,37 @@ +#ifndef SPROUT_FIXED_CONTAINER_GET_FIXED_HPP +#define SPROUT_FIXED_CONTAINER_GET_FIXED_HPP + +#include +#include + +namespace sprout { + // + // get_fixed + // + template + inline typename sprout::fixed_container_traits::fixed_container_type& get_fixed(Container& cont) { + return get_fixed_functor()(cont); + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type const& get_fixed(Container const& cont) { + return get_fixed_functor()(cont); + } + + // + // get_cfixed + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type const& get_cfixed(Container const& cont) { + return get_fixed_functor()(cont); + } + + // + // get_fixed_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type get_fixed_copy(Container const& cont) { + return get_fixed_functor()(cont); + } +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_GET_FIXED_HPP diff --git a/sprout/fixed_container/iterator.hpp b/sprout/fixed_container/iterator.hpp new file mode 100644 index 00000000..91ba76a5 --- /dev/null +++ b/sprout/fixed_container/iterator.hpp @@ -0,0 +1,24 @@ +#ifndef SPROUT_FIXED_CONTAINER_ITERATOR_HPP +#define SPROUT_FIXED_CONTAINER_ITERATOR_HPP + +#include +#include +#include +#include + +namespace sprout { + // + // fixed_iterator + // + template + struct fixed_iterator { + public: + typedef typename sprout::detail::if_c< + std::is_const::value, + typename sprout::fixed_container_traits::const_iterator, + typename sprout::fixed_container_traits::iterator + >::type type; + }; +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_ITERATOR_HPP diff --git a/sprout/fixed_container/metafunctions.hpp b/sprout/fixed_container/metafunctions.hpp new file mode 100644 index 00000000..881f5675 --- /dev/null +++ b/sprout/fixed_container/metafunctions.hpp @@ -0,0 +1,21 @@ +#ifndef SPROUT_FIXED_CONTAINER_METAFUNCTIONS_HPP +#define SPROUT_FIXED_CONTAINER_METAFUNCTIONS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif // #ifndef SPROUT_FIXED_CONTAINER_METAFUNCTIONS_HPP diff --git a/sprout/fixed_container/mutable_iterator.hpp b/sprout/fixed_container/mutable_iterator.hpp new file mode 100644 index 00000000..dd3403c3 --- /dev/null +++ b/sprout/fixed_container/mutable_iterator.hpp @@ -0,0 +1,18 @@ +#ifndef SPROUT_FIXED_CONTAINER_MUTABLE_ITERATOR_HPP +#define SPROUT_FIXED_CONTAINER_MUTABLE_ITERATOR_HPP + +#include +#include + +namespace sprout { + // + // fixed_mutable_iterator + // + template + struct fixed_mutable_iterator { + public: + typedef typename sprout::fixed_container_traits::iterator type; + }; +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_MUTABLE_ITERATOR_HPP diff --git a/sprout/fixed_container/mutable_pointer.hpp b/sprout/fixed_container/mutable_pointer.hpp new file mode 100644 index 00000000..00e9c317 --- /dev/null +++ b/sprout/fixed_container/mutable_pointer.hpp @@ -0,0 +1,18 @@ +#ifndef SPROUT_FIXED_CONTAINER_MUTABLE_POINTER_HPP +#define SPROUT_FIXED_CONTAINER_MUTABLE_POINTER_HPP + +#include +#include + +namespace sprout { + // + // fixed_mutable_pointer + // + template + struct fixed_mutable_pointer { + public: + typedef typename sprout::fixed_container_traits::pointer type; + }; +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_MUTABLE_POINTER_HPP diff --git a/sprout/fixed_container/mutable_reference.hpp b/sprout/fixed_container/mutable_reference.hpp new file mode 100644 index 00000000..930ca604 --- /dev/null +++ b/sprout/fixed_container/mutable_reference.hpp @@ -0,0 +1,18 @@ +#ifndef SPROUT_FIXED_CONTAINER_MUTABLE_REFERENCE_HPP +#define SPROUT_FIXED_CONTAINER_MUTABLE_REFERENCE_HPP + +#include +#include + +namespace sprout { + // + // fixed_mutable_reference + // + template + struct fixed_mutable_reference { + public: + typedef typename sprout::fixed_container_traits::reference type; + }; +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_MUTABLE_REFERENCE_HPP diff --git a/sprout/fixed_container/pointer.hpp b/sprout/fixed_container/pointer.hpp new file mode 100644 index 00000000..66c36fff --- /dev/null +++ b/sprout/fixed_container/pointer.hpp @@ -0,0 +1,24 @@ +#ifndef SPROUT_FIXED_CONTAINER_POINTER_HPP +#define SPROUT_FIXED_CONTAINER_POINTER_HPP + +#include +#include +#include +#include + +namespace sprout { + // + // fixed_pointer + // + template + struct fixed_pointer { + public: + typedef typename sprout::detail::if_c< + std::is_const::value, + typename sprout::fixed_container_traits::const_pointer, + typename sprout::fixed_container_traits::pointer + >::type type; + }; +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_POINTER_HPP diff --git a/sprout/fixed_container/rebind_fixed_size_eval.hpp b/sprout/fixed_container/rebind_fixed_size_eval.hpp new file mode 100644 index 00000000..ace9980f --- /dev/null +++ b/sprout/fixed_container/rebind_fixed_size_eval.hpp @@ -0,0 +1,17 @@ +#ifndef SPROUT_FIXED_CONTAINER_REBIND_FIXED_SIZE_EVAL_HPP +#define SPROUT_FIXED_CONTAINER_REBIND_FIXED_SIZE_EVAL_HPP + +#include +#include + +namespace sprout { + // + // rebind_fixed_size_eval + // + template::size_type S> + struct rebind_fixed_size_eval + : public rebind_fixed_size::template apply + {}; +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_REBIND_FIXED_SIZE_EVAL_HPP diff --git a/sprout/fixed_container/reference.hpp b/sprout/fixed_container/reference.hpp new file mode 100644 index 00000000..0a475755 --- /dev/null +++ b/sprout/fixed_container/reference.hpp @@ -0,0 +1,24 @@ +#ifndef SPROUT_FIXED_CONTAINER_REFERENCE_HPP +#define SPROUT_FIXED_CONTAINER_REFERENCE_HPP + +#include +#include +#include +#include + +namespace sprout { + // + // fixed_reference + // + template + struct fixed_reference { + public: + typedef typename sprout::detail::if_c< + std::is_const::value, + typename sprout::fixed_container_traits::const_reference, + typename sprout::fixed_container_traits::reference + >::type type; + }; +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_REFERENCE_HPP diff --git a/sprout/fixed_container/size.hpp b/sprout/fixed_container/size.hpp new file mode 100644 index 00000000..24f86635 --- /dev/null +++ b/sprout/fixed_container/size.hpp @@ -0,0 +1,20 @@ +#ifndef SPROUT_FIXED_CONTAINER_SIZE_HPP +#define SPROUT_FIXED_CONTAINER_SIZE_HPP + +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + // + // size + // + template + SPROUT_CONSTEXPR typename sprout::fixed_container_traits::difference_type size(Range const& range) { + return NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::begin(range), sprout::end(range)); + } +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_SIZE_HPP diff --git a/sprout/fixed_container/size_type.hpp b/sprout/fixed_container/size_type.hpp new file mode 100644 index 00000000..e8b1183e --- /dev/null +++ b/sprout/fixed_container/size_type.hpp @@ -0,0 +1,18 @@ +#ifndef SPROUT_FIXED_CONTAINER_SIZE_TYPE_HPP +#define SPROUT_FIXED_CONTAINER_SIZE_TYPE_HPP + +#include +#include + +namespace sprout { + // + // fixed_size_type + // + template + struct fixed_size_type { + public: + typedef typename sprout::fixed_container_traits::size_type type; + }; +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_SIZE_TYPE_HPP diff --git a/sprout/fixed_container/traits.hpp b/sprout/fixed_container/traits.hpp new file mode 100644 index 00000000..29d56469 --- /dev/null +++ b/sprout/fixed_container/traits.hpp @@ -0,0 +1,97 @@ +#ifndef SPROUT_FIXED_CONTAINER_TRAITS_HPP +#define SPROUT_FIXED_CONTAINER_TRAITS_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace detail { + template + struct fixed_container_traits_base { + public: + typedef typename Container::value_type value_type; + typedef typename Container::iterator iterator; + typedef typename Container::const_iterator const_iterator; + typedef typename Container::reference reference; + typedef typename Container::const_reference const_reference; + typedef typename Container::size_type size_type; + typedef typename Container::difference_type difference_type; + typedef typename Container::pointer pointer; + typedef typename Container::const_pointer const_pointer; + }; + template + struct fixed_container_traits_base { + public: + typedef T value_type; + typedef T* iterator; + typedef T const* const_iterator; + typedef T& reference; + typedef T const& const_reference; + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + typedef T* pointer; + typedef T const* const_pointer; + }; + } // namespace detail + + // + // fixed_container_traits + // + template + struct fixed_container_traits + : public sprout::detail::fixed_container_traits_base + { + public: + typedef Container fixed_container_type; + public: + static constexpr typename sprout::detail::fixed_container_traits_base::size_type fixed_size + = std::tuple_size::type>::value + ; + }; + template + struct fixed_container_traits + : public sprout::detail::fixed_container_traits_base + { + public: + typedef T fixed_container_type[N]; + public: + static constexpr typename sprout::detail::fixed_container_traits_base::size_type fixed_size = N; + }; + + // + // rebind_fixed_size + // + template + struct rebind_fixed_size { + public: + template::size_type S> + struct apply; + }; + template + struct rebind_fixed_size { + public: + template::size_type S> + struct apply { + public: + typedef T type[S]; + }; + }; + + // + // get_fixed_functor + // + template + struct get_fixed_functor { + public: + typename sprout::fixed_container_traits::fixed_container_type& operator()(Container& cont) const { + return cont; + } + SPROUT_CONSTEXPR typename sprout::fixed_container_traits::fixed_container_type const& operator()(Container const& cont) const { + return cont; + } + }; +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_TRAITS_HPP diff --git a/sprout/fixed_container/value_type.hpp b/sprout/fixed_container/value_type.hpp new file mode 100644 index 00000000..ddb525e3 --- /dev/null +++ b/sprout/fixed_container/value_type.hpp @@ -0,0 +1,18 @@ +#ifndef SPROUT_FIXED_CONTAINER_VALUE_TYPE_HPP +#define SPROUT_FIXED_CONTAINER_VALUE_TYPE_HPP + +#include +#include + +namespace sprout { + // + // fixed_value_type + // + template + struct fixed_value_type { + public: + typedef typename sprout::fixed_container_traits::value_type type; + }; +} // namespace sprout + +#endif // #ifndef SPROUT_FIXED_CONTAINER_VALUE_TYPE_HPP diff --git a/sprout/index_tuple.hpp b/sprout/index_tuple.hpp new file mode 100644 index 00000000..4bab21dc --- /dev/null +++ b/sprout/index_tuple.hpp @@ -0,0 +1,59 @@ +#ifndef SPROUT_INDEX_TUPLE_HPP +#define SPROUT_INDEX_TUPLE_HPP + +#include +#include + +namespace sprout { + // + // index_tuple + // + template + struct index_tuple {}; + + // + // index_range + // + template< + std::ptrdiff_t First, + std::ptrdiff_t Last, + std::ptrdiff_t Step = 1, + typename Acc = sprout::index_tuple<>, + bool Break = (First >= Last) + > + struct index_range { + typedef Acc type; + }; + template< + std::ptrdiff_t First, + std::ptrdiff_t Last, + std::ptrdiff_t Step, + std::ptrdiff_t ...Indexes + > + struct index_range, false> + : public sprout::index_range > + {}; + + // + // index_n + // + template< + std::ptrdiff_t I, + std::ptrdiff_t N, + typename Acc = sprout::index_tuple<>, + bool Break = (N == 0) + > + struct index_n { + typedef Acc type; + }; + template< + std::ptrdiff_t I, + std::ptrdiff_t N, + std::ptrdiff_t ...Indexes + > + struct index_n, false> + : public sprout::index_n > + {}; +} // namespace sprout + +#endif // #ifndef SPROUT_INDEX_TUPLE_HPP diff --git a/sprout/operation.hpp b/sprout/operation.hpp new file mode 100644 index 00000000..b99f98de --- /dev/null +++ b/sprout/operation.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_HPP +#define SPROUT_OPERATION_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_HPP diff --git a/sprout/operation/erase.hpp b/sprout/operation/erase.hpp new file mode 100644 index 00000000..173e920c --- /dev/null +++ b/sprout/operation/erase.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_ERASE_HPP +#define SPROUT_OPERATION_ERASE_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_ERASE_HPP diff --git a/sprout/operation/erase_n.hpp b/sprout/operation/erase_n.hpp new file mode 100644 index 00000000..49d107cc --- /dev/null +++ b/sprout/operation/erase_n.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_ERASE_N_HPP +#define SPROUT_OPERATION_ERASE_N_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_ERASE_N_HPP diff --git a/sprout/operation/fit.hpp b/sprout/operation/fit.hpp new file mode 100644 index 00000000..19c3a572 --- /dev/null +++ b/sprout/operation/fit.hpp @@ -0,0 +1,25 @@ +#ifndef SPROUT_OPERATION_FIT_HPP +#define SPROUT_OPERATION_FIT_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_FIT_HPP diff --git a/sprout/operation/fit/erase.hpp b/sprout/operation/fit/erase.hpp new file mode 100644 index 00000000..b2975d0e --- /dev/null +++ b/sprout/operation/fit/erase.hpp @@ -0,0 +1,57 @@ +#ifndef SPROUT_OPERATION_FIT_ERASE_HPP +#define SPROUT_OPERATION_FIT_ERASE_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // erase + // + template + struct erase { + public: + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // erase + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::erase::type erase( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator pos + ) + { + return sprout::sub_copy( + sprout::fixed::erase(cont, pos), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) - 1 + ); + } + // + // erase + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::erase::type erase( + Container const& cont, + typename sprout::fixed_container_traits::difference_type pos + ) + { + return sprout::sub_copy( + sprout::fixed::erase(cont, pos), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) - 1 + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_ERASE_HPP diff --git a/sprout/operation/fit/erase_n.hpp b/sprout/operation/fit/erase_n.hpp new file mode 100644 index 00000000..d62eda13 --- /dev/null +++ b/sprout/operation/fit/erase_n.hpp @@ -0,0 +1,57 @@ +#ifndef SPROUT_OPERATION_FIT_ERASE_N_HPP +#define SPROUT_OPERATION_FIT_ERASE_N_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // erase_n + // + template + struct erase_n { + public: + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // erase_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::erase_n::type erase_n( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator pos + ) + { + return sprout::sub_copy( + sprout::fixed::erase_n(cont, pos), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) - 1 + ); + } + // + // erase_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::erase_n::type erase_n( + Container const& cont, + typename sprout::fixed_container_traits::difference_type pos + ) + { + return sprout::sub_copy( + sprout::fixed::erase_n(cont, pos), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) - 1 + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_ERASE_N_HPP diff --git a/sprout/operation/fit/insert.hpp b/sprout/operation/fit/insert.hpp new file mode 100644 index 00000000..7967fa56 --- /dev/null +++ b/sprout/operation/fit/insert.hpp @@ -0,0 +1,61 @@ +#ifndef SPROUT_OPERATION_FIT_INSERT_HPP +#define SPROUT_OPERATION_FIT_INSERT_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // insert + // + template + struct insert { + public: + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // insert + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::insert::type insert( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator pos, + T const& v, + Values const&... values + ) + { + return sprout::sub_copy( + sprout::fixed::insert(cont, pos, v, values...), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) + 1 + sizeof...(Values) + ); + } + // + // insert + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::insert::type insert( + Container const& cont, + typename sprout::fixed_container_traits::difference_type pos, + T const& v, + Values const&... values + ) + { + return sprout::sub_copy( + sprout::fixed::insert(cont, pos, v, values...), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) + 1 + sizeof...(Values) + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_INSERT_HPP diff --git a/sprout/operation/fit/insert_n.hpp b/sprout/operation/fit/insert_n.hpp new file mode 100644 index 00000000..c2efddfb --- /dev/null +++ b/sprout/operation/fit/insert_n.hpp @@ -0,0 +1,61 @@ +#ifndef SPROUT_OPERATION_FIT_INSERT_N_HPP +#define SPROUT_OPERATION_FIT_INSERT_N_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // insert_n + // + template + struct insert_n { + public: + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // insert_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::insert_n::type insert_n( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator pos, + T const& v, + Values const&... values + ) + { + return sprout::sub_copy( + sprout::fixed::insert_n(cont, pos, v, values...), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) + (1 + sizeof...(Values)) * N + ); + } + // + // insert_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::insert_n::type insert_n( + Container const& cont, + typename sprout::fixed_container_traits::difference_type pos, + T const& v, + Values const&... values + ) + { + return sprout::sub_copy( + sprout::fixed::insert_n(cont, pos, v, values...), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) + (1 + sizeof...(Values)) * N + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_INSERT_N_HPP diff --git a/sprout/operation/fit/join.hpp b/sprout/operation/fit/join.hpp new file mode 100644 index 00000000..7761c699 --- /dev/null +++ b/sprout/operation/fit/join.hpp @@ -0,0 +1,58 @@ +#ifndef SPROUT_OPERATION_FIT_JOIN_HPP +#define SPROUT_OPERATION_FIT_JOIN_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // join + // + template + struct join { + public: + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // join + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::join::type join( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator pos, + Input const& input + ) + { + return sprout::sub_copy( + sprout::fixed::join(cont, pos, input), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) + sprout::size(input) + ); + } + // + // join + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::join::type join( + Container const& cont, + typename sprout::fixed_container_traits::difference_type pos, + Input const& input + ) + { + return sprout::sub_copy( + sprout::fixed::join(cont, pos, input), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) + sprout::size(input) + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_JOIN_HPP diff --git a/sprout/operation/fit/join_back.hpp b/sprout/operation/fit/join_back.hpp new file mode 100644 index 00000000..73441160 --- /dev/null +++ b/sprout/operation/fit/join_back.hpp @@ -0,0 +1,40 @@ +#ifndef SPROUT_OPERATION_FIT_JOIN_BACK_HPP +#define SPROUT_OPERATION_FIT_JOIN_BACK_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // join_back + // + template + struct join_back { + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // join_back + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::join_back::type join_back( + Container const& cont, + Input const& input + ) + { + return sprout::sub_copy( + sprout::fixed::join_back(cont, input), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) + sprout::size(input) + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_JOIN_BACK_HPP diff --git a/sprout/operation/fit/join_front.hpp b/sprout/operation/fit/join_front.hpp new file mode 100644 index 00000000..6f197cc8 --- /dev/null +++ b/sprout/operation/fit/join_front.hpp @@ -0,0 +1,40 @@ +#ifndef SPROUT_OPERATION_FIT_JOIN_FRONT_HPP +#define SPROUT_OPERATION_FIT_JOIN_FRONT_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // join_front + // + template + struct join_front { + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // join_front + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::join_front::type join_front( + Container const& cont, + Input const& input + ) + { + return sprout::sub_copy( + sprout::fixed::join_front(cont, input), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) + sprout::size(input) + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_JOIN_FRONT_HPP diff --git a/sprout/operation/fit/pop_back.hpp b/sprout/operation/fit/pop_back.hpp new file mode 100644 index 00000000..286382a2 --- /dev/null +++ b/sprout/operation/fit/pop_back.hpp @@ -0,0 +1,41 @@ +#ifndef SPROUT_OPERATION_FIT_POP_BACK_HPP +#define SPROUT_OPERATION_FIT_POP_BACK_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // pop_back + // + template + struct pop_back { + public: + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // pop_back + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::pop_back::type pop_back( + Container const& cont + ) + { + return sprout::sub_copy( + sprout::fixed::pop_back(cont), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) - 1 + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_POP_BACK_HPP diff --git a/sprout/operation/fit/pop_back_n.hpp b/sprout/operation/fit/pop_back_n.hpp new file mode 100644 index 00000000..df1af84d --- /dev/null +++ b/sprout/operation/fit/pop_back_n.hpp @@ -0,0 +1,41 @@ +#ifndef SPROUT_OPERATION_FIT_POP_BACK_N_HPP +#define SPROUT_OPERATION_FIT_POP_BACK_N_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // pop_back_n + // + template + struct pop_back_n { + public: + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // pop_back_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::pop_back_n::type pop_back_n( + Container const& cont + ) + { + return sprout::sub_copy( + sprout::fixed::pop_back_n(cont), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) - N + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_POP_BACK_N_HPP diff --git a/sprout/operation/fit/pop_front.hpp b/sprout/operation/fit/pop_front.hpp new file mode 100644 index 00000000..0a4e7f57 --- /dev/null +++ b/sprout/operation/fit/pop_front.hpp @@ -0,0 +1,41 @@ +#ifndef SPROUT_OPERATION_FIT_POP_FRONT_HPP +#define SPROUT_OPERATION_FIT_POP_FRONT_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // pop_front + // + template + struct pop_front { + public: + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // pop_front + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::pop_front::type pop_front( + Container const& cont + ) + { + return sprout::sub_copy( + sprout::fixed::pop_front(cont), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) - 1 + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_POP_FRONT_HPP diff --git a/sprout/operation/fit/pop_front_n.hpp b/sprout/operation/fit/pop_front_n.hpp new file mode 100644 index 00000000..1b6e1d64 --- /dev/null +++ b/sprout/operation/fit/pop_front_n.hpp @@ -0,0 +1,41 @@ +#ifndef SPROUT_OPERATION_FIT_POP_FRONT_N_HPP +#define SPROUT_OPERATION_FIT_POP_FRONT_N_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // pop_front_n + // + template + struct pop_front_n { + public: + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // pop_front_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::pop_front_n::type pop_front_n( + Container const& cont + ) + { + return sprout::sub_copy( + sprout::fixed::pop_front_n(cont), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) - N + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_POP_FRONT_N_HPP diff --git a/sprout/operation/fit/push_back.hpp b/sprout/operation/fit/push_back.hpp new file mode 100644 index 00000000..cb6ae83f --- /dev/null +++ b/sprout/operation/fit/push_back.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_OPERATION_FIT_PUSH_BACK_HPP +#define SPROUT_OPERATION_FIT_PUSH_BACK_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // push_back + // + template + struct push_back { + public: + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // push_back + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::push_back::type push_back( + Container const& cont, + T const& v, + Values const&... values + ) + { + return sprout::sub_copy( + sprout::fixed::push_back(cont, v, values...), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) + 1 + sizeof...(Values) + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_PUSH_BACK_HPP diff --git a/sprout/operation/fit/push_back_n.hpp b/sprout/operation/fit/push_back_n.hpp new file mode 100644 index 00000000..ab31db81 --- /dev/null +++ b/sprout/operation/fit/push_back_n.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_OPERATION_FIT_PUSH_BACK_N_HPP +#define SPROUT_OPERATION_FIT_PUSH_BACK_N_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // push_back_n + // + template + struct push_back_n { + public: + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // push_back_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::push_back_n::type push_back_n( + Container const& cont, + T const& v, + Values const&... values + ) + { + return sprout::sub_copy( + sprout::fixed::push_back_n(cont, v, values...), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) + (1 + sizeof...(Values)) * N + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_PUSH_BACK_N_HPP diff --git a/sprout/operation/fit/push_front.hpp b/sprout/operation/fit/push_front.hpp new file mode 100644 index 00000000..8b935eba --- /dev/null +++ b/sprout/operation/fit/push_front.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_OPERATION_FIT_PUSH_FRONT_HPP +#define SPROUT_OPERATION_FIT_PUSH_FRONT_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // push_front + // + template + struct push_front { + public: + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // push_front + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::push_front::type push_front( + Container const& cont, + T const& v, + Values const&... values + ) + { + return sprout::sub_copy( + sprout::fixed::push_front(cont, v, values...), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) + 1 + sizeof...(Values) + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_PUSH_FRONT_HPP diff --git a/sprout/operation/fit/push_front_n.hpp b/sprout/operation/fit/push_front_n.hpp new file mode 100644 index 00000000..30308a89 --- /dev/null +++ b/sprout/operation/fit/push_front_n.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_OPERATION_FIT_PUSH_FRONT_N_HPP +#define SPROUT_OPERATION_FIT_PUSH_FRONT_N_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // push_front_n + // + template + struct push_front_n { + public: + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // push_front_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::push_front_n::type push_front_n( + Container const& cont, + T const& v, + Values const&... values + ) + { + return sprout::sub_copy( + sprout::fixed::push_front_n(cont, v, values...), + sprout::fixed_begin_offset(cont), + sprout::fixed_end_offset(cont) + (1 + sizeof...(Values)) * N + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_PUSH_FRONT_N_HPP diff --git a/sprout/operation/fit/realign.hpp b/sprout/operation/fit/realign.hpp new file mode 100644 index 00000000..14aa7f85 --- /dev/null +++ b/sprout/operation/fit/realign.hpp @@ -0,0 +1,56 @@ +#ifndef SPROUT_OPERATION_FIT_REALIGN_HPP +#define SPROUT_OPERATION_FIT_REALIGN_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // realign + // + template + struct realign { + public: + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // realign + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::realign::type realign( + Container const& cont, + T const& v + ) + { + return sprout::sub_copy( + sprout::fixed::realign(cont, v), + 0, + sprout::size(cont) + ); + } + + // + // realign + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::realign::type realign( + Container const& cont + ) + { + return sprout::sub_copy( + sprout::fixed::realign(cont), + 0, + sprout::size(cont) + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_REALIGN_HPP diff --git a/sprout/operation/fit/realign_to.hpp b/sprout/operation/fit/realign_to.hpp new file mode 100644 index 00000000..c3e14eb7 --- /dev/null +++ b/sprout/operation/fit/realign_to.hpp @@ -0,0 +1,56 @@ +#ifndef SPROUT_OPERATION_FIT_REALIGN_TO_HPP +#define SPROUT_OPERATION_FIT_REALIGN_TO_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // realign_to + // + template + struct realign_to { + public: + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // realign_to + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::realign_to::type realign_to( + Container const& cont, + T const& v + ) + { + return sprout::sub_copy( + sprout::fixed::realign_to(cont, v), + 0, + sprout::size(cont) + ); + } + + // + // realign_to + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::realign_to::type realign_to( + Container const& cont + ) + { + return sprout::sub_copy( + sprout::fixed::realign_to(cont), + 0, + sprout::size(cont) + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_REALIGN_TO_HPP diff --git a/sprout/operation/fit/resize.hpp b/sprout/operation/fit/resize.hpp new file mode 100644 index 00000000..f5c6e4c1 --- /dev/null +++ b/sprout/operation/fit/resize.hpp @@ -0,0 +1,57 @@ +#ifndef SPROUT_OPERATION_FIT_RESIZE_HPP +#define SPROUT_OPERATION_FIT_RESIZE_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // resize + // + template + struct resize { + public: + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // resize + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::resize::type resize( + Container const& cont, + T const& v + ) + { + return sprout::sub_copy( + sprout::fixed::resize(cont, v), + 0, + sprout::fixed_container_traits::type>::fixed_size + ); + } + + // + // resize + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::resize::type resize( + Container const& cont + ) + { + return sprout::sub_copy( + sprout::fixed::resize(cont), + 0, + sprout::fixed_container_traits::type>::fixed_size + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_RESIZE_HPP diff --git a/sprout/operation/fit/resize_backward.hpp b/sprout/operation/fit/resize_backward.hpp new file mode 100644 index 00000000..7c7df21e --- /dev/null +++ b/sprout/operation/fit/resize_backward.hpp @@ -0,0 +1,57 @@ +#ifndef SPROUT_OPERATION_FIT_RESIZE_BACKWARD_HPP +#define SPROUT_OPERATION_FIT_RESIZE_BACKWARD_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fit { + namespace result_of { + // + // resize_backward + // + template + struct resize_backward { + public: + typedef sprout::sub_array::type> type; + }; + } // namespace result_of + + // + // resize_backward + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::resize_backward::type resize_backward( + Container const& cont, + T const& v + ) + { + return sprout::sub_copy( + sprout::fixed::resize_backward(cont, v), + 0, + sprout::fixed_container_traits::type>::fixed_size + ); + } + + // + // resize_backward + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::resize_backward::type resize_backward( + Container const& cont + ) + { + return sprout::sub_copy( + sprout::fixed::resize_backward(cont), + 0, + sprout::fixed_container_traits::type>::fixed_size + ); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIT_RESIZE_BACKWARD_HPP diff --git a/sprout/operation/fixed.hpp b/sprout/operation/fixed.hpp new file mode 100644 index 00000000..50104f45 --- /dev/null +++ b/sprout/operation/fixed.hpp @@ -0,0 +1,25 @@ +#ifndef SPROUT_OPERATION_FIXED_HPP +#define SPROUT_OPERATION_FIXED_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_FIXED_HPP diff --git a/sprout/operation/fixed/erase.hpp b/sprout/operation/fixed/erase.hpp new file mode 100644 index 00000000..8af44c06 --- /dev/null +++ b/sprout/operation/fixed/erase.hpp @@ -0,0 +1,81 @@ +#ifndef SPROUT_OPERATION_FIXED_ERASE_HPP +#define SPROUT_OPERATION_FIXED_ERASE_HPP + +#include +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace result_of { + // + // erase + // + template + struct erase { + static_assert(sprout::fixed_container_traits::fixed_size >= 1, "fixed_size >= 1"); + public: + typedef typename sprout::rebind_fixed_size< + typename sprout::fixed_container_traits::fixed_container_type + >::template apply< + sprout::fixed_container_traits::fixed_size - 1 + >::type type; + }; + } // namespace result_of + + namespace detail { + template + SPROUT_CONSTEXPR inline Result erase_impl( + Container const& cont, + sprout::index_tuple, + typename sprout::fixed_container_traits::difference_type pos + ) + { + return Result{ + (Indexes < sprout::fixed_container_traits::fixed_size - 1 + ? (Indexes < pos + ? *(sprout::fixed_begin(cont) + Indexes) + : *(sprout::fixed_begin(cont) + Indexes + 1) + ) + : typename sprout::fixed_container_traits::value_type{} + )... + }; + } + } // namespace detail + // + // erase + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::erase::type erase( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator pos + ) + { + return sprout::fixed::detail::erase_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::fixed_begin(cont), pos) + ); + } + // + // erase + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::erase::type erase( + Container const& cont, + typename sprout::fixed_container_traits::difference_type pos + ) + { + return sprout::fixed::detail::erase_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::fixed_begin(cont), sprout::begin(cont) + pos) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_ERASE_HPP diff --git a/sprout/operation/fixed/erase_n.hpp b/sprout/operation/fixed/erase_n.hpp new file mode 100644 index 00000000..77d06fb9 --- /dev/null +++ b/sprout/operation/fixed/erase_n.hpp @@ -0,0 +1,81 @@ +#ifndef SPROUT_OPERATION_FIXED_ERASE_N_HPP +#define SPROUT_OPERATION_FIXED_ERASE_N_HPP + +#include +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace result_of { + // + // erase_n + // + template + struct erase_n { + static_assert(sprout::fixed_container_traits::fixed_size >= N, "fixed_size >= N"); + public: + typedef typename sprout::rebind_fixed_size< + typename sprout::fixed_container_traits::fixed_container_type + >::template apply< + sprout::fixed_container_traits::fixed_size - N + >::type type; + }; + } // namespace result_of + + namespace detail { + template + SPROUT_CONSTEXPR inline Result erase_n_impl( + Container const& cont, + sprout::index_tuple, + typename sprout::fixed_container_traits::difference_type pos + ) + { + return Result{ + (Indexes < sprout::fixed_container_traits::fixed_size - N + ? (Indexes < pos + ? *(sprout::fixed_begin(cont) + Indexes) + : *(sprout::fixed_begin(cont) + Indexes + N) + ) + : typename sprout::fixed_container_traits::value_type{} + )... + }; + } + } // namespace detail + // + // erase_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::erase_n::type erase_n( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator pos + ) + { + return sprout::fixed::detail::erase_n_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::fixed_begin(cont), pos) + ); + } + // + // erase_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::erase_n::type erase_n( + Container const& cont, + typename sprout::fixed_container_traits::difference_type pos + ) + { + return sprout::fixed::detail::erase_n_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::fixed_begin(cont), sprout::begin(cont) + pos) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_ERASE_N_HPP diff --git a/sprout/operation/fixed/insert.hpp b/sprout/operation/fixed/insert.hpp new file mode 100644 index 00000000..6b17dbac --- /dev/null +++ b/sprout/operation/fixed/insert.hpp @@ -0,0 +1,94 @@ +#ifndef SPROUT_OPERATION_FIXED_INSERT_HPP +#define SPROUT_OPERATION_FIXED_INSERT_HPP + +#include +#include +#include +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace result_of { + // + // insert + // + template + struct insert { + public: + typedef typename sprout::rebind_fixed_size< + typename sprout::fixed_container_traits::fixed_container_type + >::template apply< + sprout::fixed_container_traits::fixed_size + 1 + sizeof...(Values) + >::type type; + }; + } // namespace result_of + + namespace detail { + template + SPROUT_CONSTEXPR inline Result insert_impl( + Container const& cont, + sprout::index_tuple, + typename sprout::fixed_container_traits::difference_type pos, + T const& v, + Values const&... values + ) + { + return Result{ + (Indexes < sprout::fixed_container_traits::fixed_size + 1 + sizeof...(Values) + ? (Indexes < pos + ? *(sprout::fixed_begin(cont) + Indexes) + : Indexes < pos + 1 + sizeof...(Values) + ? sprout::detail::param_at::value_type>(Indexes - pos, v, values...) + : *(sprout::fixed_begin(cont) + Indexes - (1 + sizeof...(Values))) + ) + : typename sprout::fixed_container_traits::value_type{} + )... + }; + } + } // namespace detail + // + // insert + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::insert::type insert( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator pos, + T const& v, + Values const&... values + ) + { + return sprout::fixed::detail::insert_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::fixed_begin(cont), pos), + v, + values... + ); + } + // + // insert + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::insert::type insert( + Container const& cont, + typename sprout::fixed_container_traits::difference_type pos, + T const& v, + Values const&... values + ) + { + return sprout::fixed::detail::insert_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::fixed_begin(cont), sprout::begin(cont) + pos), + v, + values... + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_INSERT_HPP diff --git a/sprout/operation/fixed/insert_n.hpp b/sprout/operation/fixed/insert_n.hpp new file mode 100644 index 00000000..1a010634 --- /dev/null +++ b/sprout/operation/fixed/insert_n.hpp @@ -0,0 +1,95 @@ +#ifndef SPROUT_OPERATION_FIXED_INSERT_N_HPP +#define SPROUT_OPERATION_FIXED_INSERT_N_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace result_of { + // + // insert_n + // + template + struct insert_n { + public: + typedef typename sprout::rebind_fixed_size< + typename sprout::fixed_container_traits::fixed_container_type + >::template apply< + sprout::fixed_container_traits::fixed_size + (1 + sizeof...(Values)) * N + >::type type; + }; + } // namespace result_of + + namespace detail { + template + SPROUT_CONSTEXPR inline Result insert_n_impl( + Container const& cont, + sprout::index_tuple, + typename sprout::fixed_container_traits::difference_type pos, + T const& v, + Values const&... values + ) + { + return Result{ + (Indexes < sprout::fixed_container_traits::fixed_size + (1 + sizeof...(Values)) * N + ? (Indexes < pos + ? *(sprout::fixed_begin(cont) + Indexes) + : Indexes < pos + (1 + sizeof...(Values)) * N + ? sprout::detail::param_at::value_type>((Indexes - pos) % (1 + sizeof...(Values)), v, values...) + : *(sprout::fixed_begin(cont) + Indexes - (1 + sizeof...(Values)) * N) + ) + : typename sprout::fixed_container_traits::value_type{} + )... + }; + } + } // namespace detail + // + // insert_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::insert_n::type insert_n( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator pos, + T const& v, + Values const&... values + ) + { + return sprout::fixed::detail::insert_n_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::fixed_begin(cont), pos), + v, + values... + ); + } + // + // insert_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::insert_n::type insert_n( + Container const& cont, + typename sprout::fixed_container_traits::difference_type pos, + T const& v, + Values const&... values + ) + { + return sprout::fixed::detail::insert_n_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::fixed_begin(cont), sprout::begin(cont) + pos), + v, + values... + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_INSERT_N_HPP diff --git a/sprout/operation/fixed/join.hpp b/sprout/operation/fixed/join.hpp new file mode 100644 index 00000000..22b70588 --- /dev/null +++ b/sprout/operation/fixed/join.hpp @@ -0,0 +1,90 @@ +#ifndef SPROUT_OPERATION_FIXED_JOIN_HPP +#define SPROUT_OPERATION_FIXED_JOIN_HPP + +#include +#include +#include +#include +#include +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fixed { + namespace result_of { + // + // join + // + template + struct join { + public: + typedef typename sprout::rebind_fixed_size< + typename sprout::fixed_container_traits::fixed_container_type + >::template apply< + sprout::fixed_container_traits::fixed_size + sprout::fixed_container_traits::fixed_size + >::type type; + }; + } // namespace result_of + + namespace detail { + template + SPROUT_CONSTEXPR inline Result join_impl( + Container const& cont, + sprout::index_tuple, + typename sprout::fixed_container_traits::difference_type pos, + typename sprout::fixed_container_traits::difference_type size, + Input const& input + ) + { + return Result{ + (Indexes < sprout::fixed_container_traits::fixed_size + size + ? (Indexes < pos + ? *(sprout::fixed_begin(cont) + Indexes) + : Indexes < pos + size + ? *(sprout::begin(input) + Indexes - pos) + : *(sprout::fixed_begin(cont) + Indexes - size) + ) + : typename sprout::fixed_container_traits::value_type{} + )... + }; + } + } // namespace detail + // + // join + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::join::type join( + Container const& cont, + typename sprout::fixed_container_traits::const_iterator pos, + Input const& input + ) + { + return sprout::fixed::detail::join_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::fixed_begin(cont), pos), + sprout::size(input), + input + ); + } + // + // join + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::join::type join( + Container const& cont, + typename sprout::fixed_container_traits::difference_type pos, + Input const& input + ) + { + return sprout::fixed::detail::join_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::fixed_begin(cont), sprout::begin(cont) + pos), + sprout::size(input), + input + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_JOIN_HPP diff --git a/sprout/operation/fixed/join_back.hpp b/sprout/operation/fixed/join_back.hpp new file mode 100644 index 00000000..2ad5fc48 --- /dev/null +++ b/sprout/operation/fixed/join_back.hpp @@ -0,0 +1,43 @@ +#ifndef SPROUT_OPERATION_FIXED_JOIN_BACK_HPP +#define SPROUT_OPERATION_FIXED_JOIN_BACK_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace result_of { + // + // join_back + // + template + struct join_back + : public join + {}; + } // namespace result_of + + // + // join_back + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::join_back::type join_back( + Container const& cont, + Input const& input + ) + { + return sprout::fixed::detail::join_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + sprout::fixed_end_offset(cont), + sprout::size(input), + input + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_JOIN_BACK_HPP diff --git a/sprout/operation/fixed/join_front.hpp b/sprout/operation/fixed/join_front.hpp new file mode 100644 index 00000000..42334874 --- /dev/null +++ b/sprout/operation/fixed/join_front.hpp @@ -0,0 +1,43 @@ +#ifndef SPROUT_OPERATION_FIXED_JOIN_FRONT_HPP +#define SPROUT_OPERATION_FIXED_JOIN_FRONT_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace result_of { + // + // join_front + // + template + struct join_front + : public join + {}; + } // namespace result_of + + // + // join_front + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::join_front::type join_front( + Container const& cont, + Input const& input + ) + { + return sprout::fixed::detail::join_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + sprout::fixed_begin_offset(cont), + sprout::size(input), + input + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_JOIN_FRONT_HPP diff --git a/sprout/operation/fixed/pop_back.hpp b/sprout/operation/fixed/pop_back.hpp new file mode 100644 index 00000000..cbb13234 --- /dev/null +++ b/sprout/operation/fixed/pop_back.hpp @@ -0,0 +1,40 @@ +#ifndef SPROUT_OPERATION_FIXED_POP_BACK_HPP +#define SPROUT_OPERATION_FIXED_POP_BACK_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace result_of { + // + // pop_back + // + template + struct pop_back + : public erase + {}; + } // namespace result_of + + // + // pop_back + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::pop_back::type pop_back( + Container const& cont + ) + { + return sprout::fixed::detail::erase_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + sprout::fixed_end_offset(cont) - 1 + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_POP_BACK_HPP diff --git a/sprout/operation/fixed/pop_back_n.hpp b/sprout/operation/fixed/pop_back_n.hpp new file mode 100644 index 00000000..2713285d --- /dev/null +++ b/sprout/operation/fixed/pop_back_n.hpp @@ -0,0 +1,40 @@ +#ifndef SPROUT_OPERATION_FIXED_POP_BACK_N_HPP +#define SPROUT_OPERATION_FIXED_POP_BACK_N_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace result_of { + // + // pop_back_n + // + template + struct pop_back_n + : public erase_n + {}; + } // namespace result_of + + // + // pop_back_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::pop_back_n::type pop_back_n( + Container const& cont + ) + { + return sprout::fixed::detail::erase_n_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + sprout::fixed_end_offset(cont) - N + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_POP_BACK_N_HPP diff --git a/sprout/operation/fixed/pop_front.hpp b/sprout/operation/fixed/pop_front.hpp new file mode 100644 index 00000000..4dfad975 --- /dev/null +++ b/sprout/operation/fixed/pop_front.hpp @@ -0,0 +1,40 @@ +#ifndef SPROUT_OPERATION_FIXED_POP_FRONT_HPP +#define SPROUT_OPERATION_FIXED_POP_FRONT_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace result_of { + // + // pop_front + // + template + struct pop_front + : public erase + {}; + } // namespace result_of + + // + // pop_front + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::pop_front::type pop_front( + Container const& cont + ) + { + return sprout::fixed::detail::erase_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + sprout::fixed_begin_offset(cont) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_POP_FRONT_HPP diff --git a/sprout/operation/fixed/pop_front_n.hpp b/sprout/operation/fixed/pop_front_n.hpp new file mode 100644 index 00000000..9dc45391 --- /dev/null +++ b/sprout/operation/fixed/pop_front_n.hpp @@ -0,0 +1,40 @@ +#ifndef SPROUT_OPERATION_FIXED_POP_FRONT_N_HPP +#define SPROUT_OPERATION_FIXED_POP_FRONT_N_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace result_of { + // + // pop_front_n + // + template + struct pop_front_n + : public erase_n + {}; + } // namespace result_of + + // + // pop_front_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::pop_front_n::type pop_front_n( + Container const& cont + ) + { + return sprout::fixed::detail::erase_n_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + sprout::fixed_begin_offset(cont) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_POP_FRONT_N_HPP diff --git a/sprout/operation/fixed/push_back.hpp b/sprout/operation/fixed/push_back.hpp new file mode 100644 index 00000000..02b48f0c --- /dev/null +++ b/sprout/operation/fixed/push_back.hpp @@ -0,0 +1,44 @@ +#ifndef SPROUT_OPERATION_FIXED_PUSH_BACK_HPP +#define SPROUT_OPERATION_FIXED_PUSH_BACK_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace result_of { + // + // push_back + // + template + struct push_back + : public insert + {}; + } // namespace result_of + + // + // push_back + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::push_back::type push_back( + Container const& cont, + T const& v, + Values const&... values + ) + { + return sprout::fixed::detail::insert_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + sprout::fixed_end_offset(cont), + v, + values... + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_PUSH_BACK_HPP diff --git a/sprout/operation/fixed/push_back_n.hpp b/sprout/operation/fixed/push_back_n.hpp new file mode 100644 index 00000000..a5deabd3 --- /dev/null +++ b/sprout/operation/fixed/push_back_n.hpp @@ -0,0 +1,44 @@ +#ifndef SPROUT_OPERATION_FIXED_PUSH_BACK_N_HPP +#define SPROUT_OPERATION_FIXED_PUSH_BACK_N_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace result_of { + // + // push_back_n + // + template + struct push_back_n + : public insert_n + {}; + } // namespace result_of + + // + // push_back_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::push_back_n::type push_back_n( + Container const& cont, + T const& v, + Values const&... values + ) + { + return sprout::fixed::detail::insert_n_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + sprout::fixed_end_offset(cont), + v, + values... + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_PUSH_BACK_N_HPP diff --git a/sprout/operation/fixed/push_front.hpp b/sprout/operation/fixed/push_front.hpp new file mode 100644 index 00000000..895c36ff --- /dev/null +++ b/sprout/operation/fixed/push_front.hpp @@ -0,0 +1,44 @@ +#ifndef SPROUT_OPERATION_FIXED_PUSH_FRONT_HPP +#define SPROUT_OPERATION_FIXED_PUSH_FRONT_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace result_of { + // + // push_front + // + template + struct push_front + : public insert + {}; + } // namespace result_of + + // + // push_front + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::push_front::type push_front( + Container const& cont, + T const& v, + Values const&... values + ) + { + return sprout::fixed::detail::insert_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + sprout::fixed_begin_offset(cont), + v, + values... + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_PUSH_FRONT_HPP diff --git a/sprout/operation/fixed/push_front_n.hpp b/sprout/operation/fixed/push_front_n.hpp new file mode 100644 index 00000000..d7cbddff --- /dev/null +++ b/sprout/operation/fixed/push_front_n.hpp @@ -0,0 +1,44 @@ +#ifndef SPROUT_OPERATION_FIXED_PUSH_FRONT_N_HPP +#define SPROUT_OPERATION_FIXED_PUSH_FRONT_N_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace result_of { + // + // push_front_n + // + template + struct push_front_n + : public insert_n + {}; + } // namespace result_of + + // + // push_front_n + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::push_front_n::type push_front_n( + Container const& cont, + T const& v, + Values const&... values + ) + { + return sprout::fixed::detail::insert_n_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + sprout::fixed_begin_offset(cont), + v, + values... + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_PUSH_FRONT_N_HPP diff --git a/sprout/operation/fixed/realign.hpp b/sprout/operation/fixed/realign.hpp new file mode 100644 index 00000000..da4a9bbf --- /dev/null +++ b/sprout/operation/fixed/realign.hpp @@ -0,0 +1,90 @@ +#ifndef SPROUT_OPERATION_FIXED_REALIGN_HPP +#define SPROUT_OPERATION_FIXED_REALIGN_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace result_of { + // + // realign + // + template + struct realign { + public: + typedef typename sprout::fixed_container_traits::fixed_container_type type; + }; + } // namespace result_of + + namespace detail { + template + SPROUT_CONSTEXPR inline Result realign_impl( + Container const& cont, + sprout::index_tuple, + typename sprout::fixed_container_traits::difference_type size, + T const& v + ) + { + return Result{ + (Indexes < size + ? *(sprout::begin(cont) + Indexes) + : v + )... + }; + } + } // namespace detail + // + // realign + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::realign::type realign( + Container const& cont, + T const& v + ) + { + return sprout::fixed::detail::realign_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + sprout::size(cont), + v + ); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline Result realign_impl( + Container const& cont, + sprout::index_tuple, + typename sprout::fixed_container_traits::difference_type size + ) + { + return Result{ + (Indexes < size + ? *(sprout::begin(cont) + Indexes) + : typename sprout::fixed_container_traits::value_type{} + )... + }; + } + } // namespace detail + // + // realign + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::realign::type realign( + Container const& cont + ) + { + return sprout::fixed::detail::realign_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + sprout::size(cont) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_REALIGN_HPP diff --git a/sprout/operation/fixed/realign_to.hpp b/sprout/operation/fixed/realign_to.hpp new file mode 100644 index 00000000..82155d3e --- /dev/null +++ b/sprout/operation/fixed/realign_to.hpp @@ -0,0 +1,62 @@ +#ifndef SPROUT_OPERATION_FIXED_REALIGN_TO_HPP +#define SPROUT_OPERATION_FIXED_REALIGN_TO_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace result_of { + // + // realign_to + // + template + struct realign_to { + public: + typedef typename sprout::rebind_fixed_size< + typename sprout::fixed_container_traits::fixed_container_type + >::template apply< + sprout::fixed_container_traits::fixed_size + >::type type; + }; + } // namespace result_of + + // + // realign_to + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::realign_to::type realign_to( + Container const& cont, + T const& v + ) + { + return sprout::fixed::detail::realign_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + sprout::size(cont), + v + ); + } + + // + // realign_to + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::realign_to::type realign_to( + Container const& cont + ) + { + return sprout::fixed::detail::realign_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + sprout::size(cont) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_REALIGN_TO_HPP diff --git a/sprout/operation/fixed/resize.hpp b/sprout/operation/fixed/resize.hpp new file mode 100644 index 00000000..dc619254 --- /dev/null +++ b/sprout/operation/fixed/resize.hpp @@ -0,0 +1,93 @@ +#ifndef SPROUT_OPERATION_FIXED_RESIZE_HPP +#define SPROUT_OPERATION_FIXED_RESIZE_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace result_of { + // + // resize + // + template + struct resize { + public: + typedef typename sprout::rebind_fixed_size< + typename sprout::fixed_container_traits::fixed_container_type + >::template apply< + N + >::type type; + }; + } // namespace result_of + + namespace detail { + template + SPROUT_CONSTEXPR inline Result resize_impl( + Container const& cont, + sprout::index_tuple, + typename sprout::fixed_container_traits::difference_type size, + T const& v + ) + { + return Result{ + (Indexes < size + ? *(sprout::begin(cont) + Indexes) + : v + )... + }; + } + } // namespace detail + // + // resize + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::resize::type resize( + Container const& cont, + T const& v + ) + { + return sprout::fixed::detail::resize_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + sprout::size(cont), + v + ); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline Result resize_impl( + Container const& cont, + sprout::index_tuple, + typename sprout::fixed_container_traits::difference_type size + ) + { + return Result{ + (Indexes < size + ? *(sprout::begin(cont) + Indexes) + : typename sprout::fixed_container_traits::value_type{} + )... + }; + } + } // namespace detail + // + // resize + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::resize::type resize( + Container const& cont + ) + { + return sprout::fixed::detail::resize_impl::type>( + cont, typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + sprout::size(cont) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_RESIZE_HPP diff --git a/sprout/operation/fixed/resize_backward.hpp b/sprout/operation/fixed/resize_backward.hpp new file mode 100644 index 00000000..389fb0cc --- /dev/null +++ b/sprout/operation/fixed/resize_backward.hpp @@ -0,0 +1,99 @@ +#ifndef SPROUT_OPERATION_FIXED_RESIZE_BACKWARD_HPP +#define SPROUT_OPERATION_FIXED_RESIZE_BACKWARD_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace result_of { + // + // resize_backward + // + template + struct resize_backward + : public resize + {}; + } // namespace result_of + + namespace detail { + template + SPROUT_CONSTEXPR inline Result resize_backward_impl( + Container const& cont, + sprout::index_tuple, + typename sprout::fixed_container_traits::difference_type size, + typename sprout::fixed_container_traits::difference_type offset, + T const& v + ) + { + return Result{ + (Indexes >= offset && Indexes < offset + size + ? *(sprout::begin(cont) + Indexes - offset) + : v + )... + }; + } + } // namespace detail + // + // resize_backward + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::resize_backward::type resize_backward( + Container const& cont, + T const& v + ) + { + return sprout::fixed::detail::resize_backward_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + sprout::size(cont), + static_cast::difference_type>( + sprout::fixed_container_traits::type>::fixed_size + ) + - sprout::size(cont), + v + ); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline Result resize_backward_impl( + Container const& cont, + sprout::index_tuple, + typename sprout::fixed_container_traits::difference_type size, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return Result{ + (Indexes >= offset && Indexes < offset + size + ? *(sprout::begin(cont) + Indexes - offset) + : typename sprout::fixed_container_traits::value_type{} + )... + }; + } + } // namespace detail + // + // resize_backward + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::resize_backward::type resize_backward( + Container const& cont + ) + { + return sprout::fixed::detail::resize_backward_impl::type>( + cont, + typename sprout::index_range<0, sprout::fixed_container_traits::type>::fixed_size>::type(), + sprout::size(cont), + static_cast::difference_type>( + sprout::fixed_container_traits::type>::fixed_size + ) + - sprout::size(cont) + ); + } + } // namespace fixed +} // namespace sprout + +#endif // #ifndef SPROUT_OPERATION_FIXED_RESIZE_BACKWARD_HPP diff --git a/sprout/operation/insert.hpp b/sprout/operation/insert.hpp new file mode 100644 index 00000000..212251d1 --- /dev/null +++ b/sprout/operation/insert.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_INSERT_HPP +#define SPROUT_OPERATION_INSERT_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_INSERT_HPP diff --git a/sprout/operation/insert_n.hpp b/sprout/operation/insert_n.hpp new file mode 100644 index 00000000..5ee3ea99 --- /dev/null +++ b/sprout/operation/insert_n.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_INSERT_N_HPP +#define SPROUT_OPERATION_INSERT_N_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_INSERT_N_HPP diff --git a/sprout/operation/join.hpp b/sprout/operation/join.hpp new file mode 100644 index 00000000..9f3eef97 --- /dev/null +++ b/sprout/operation/join.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_JOIN_HPP +#define SPROUT_OPERATION_JOIN_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_JOIN_HPP diff --git a/sprout/operation/join_back.hpp b/sprout/operation/join_back.hpp new file mode 100644 index 00000000..40ea6dee --- /dev/null +++ b/sprout/operation/join_back.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_JOIN_BACK_HPP +#define SPROUT_OPERATION_JOIN_BACK_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_JOIN_BACK_HPP diff --git a/sprout/operation/join_front.hpp b/sprout/operation/join_front.hpp new file mode 100644 index 00000000..599f4b7f --- /dev/null +++ b/sprout/operation/join_front.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_JOIN_FRONT_HPP +#define SPROUT_OPERATION_JOIN_FRONT_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_JOIN_FRONT_HPP diff --git a/sprout/operation/pop_back.hpp b/sprout/operation/pop_back.hpp new file mode 100644 index 00000000..a4481bd1 --- /dev/null +++ b/sprout/operation/pop_back.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_POP_BACK_HPP +#define SPROUT_OPERATION_POP_BACK_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_POP_BACK_HPP diff --git a/sprout/operation/pop_back_n.hpp b/sprout/operation/pop_back_n.hpp new file mode 100644 index 00000000..a21627f3 --- /dev/null +++ b/sprout/operation/pop_back_n.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_POP_BACK_N_HPP +#define SPROUT_OPERATION_POP_BACK_N_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_POP_BACK_N_HPP diff --git a/sprout/operation/pop_front.hpp b/sprout/operation/pop_front.hpp new file mode 100644 index 00000000..b04307ec --- /dev/null +++ b/sprout/operation/pop_front.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_POP_FRONT_HPP +#define SPROUT_OPERATION_POP_FRONT_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_POP_FRONT_HPP diff --git a/sprout/operation/pop_front_n.hpp b/sprout/operation/pop_front_n.hpp new file mode 100644 index 00000000..1674d52f --- /dev/null +++ b/sprout/operation/pop_front_n.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_POP_FRONT_N_HPP +#define SPROUT_OPERATION_POP_FRONT_N_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_POP_FRONT_N_HPP diff --git a/sprout/operation/push_back.hpp b/sprout/operation/push_back.hpp new file mode 100644 index 00000000..fd6e3bbd --- /dev/null +++ b/sprout/operation/push_back.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_PUSH_BACK_HPP +#define SPROUT_OPERATION_PUSH_BACK_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_PUSH_BACK_HPP diff --git a/sprout/operation/push_back_n.hpp b/sprout/operation/push_back_n.hpp new file mode 100644 index 00000000..8f29d568 --- /dev/null +++ b/sprout/operation/push_back_n.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_PUSH_BACK_N_HPP +#define SPROUT_OPERATION_PUSH_BACK_N_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_PUSH_BACK_N_HPP diff --git a/sprout/operation/push_front.hpp b/sprout/operation/push_front.hpp new file mode 100644 index 00000000..d06a973b --- /dev/null +++ b/sprout/operation/push_front.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_PUSH_FRONT_HPP +#define SPROUT_OPERATION_PUSH_FRONT_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_PUSH_FRONT_HPP diff --git a/sprout/operation/push_front_n.hpp b/sprout/operation/push_front_n.hpp new file mode 100644 index 00000000..6e6021e7 --- /dev/null +++ b/sprout/operation/push_front_n.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_PUSH_FRONT_N_HPP +#define SPROUT_OPERATION_PUSH_FRONT_N_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_PUSH_FRONT_N_HPP diff --git a/sprout/operation/realign.hpp b/sprout/operation/realign.hpp new file mode 100644 index 00000000..138b6edc --- /dev/null +++ b/sprout/operation/realign.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_REALIGN_HPP +#define SPROUT_OPERATION_REALIGN_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_REALIGN_HPP diff --git a/sprout/operation/realign_to.hpp b/sprout/operation/realign_to.hpp new file mode 100644 index 00000000..f8d9bede --- /dev/null +++ b/sprout/operation/realign_to.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_REALIGN_TO_HPP +#define SPROUT_OPERATION_REALIGN_TO_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_REALIGN_TO_HPP diff --git a/sprout/operation/resize.hpp b/sprout/operation/resize.hpp new file mode 100644 index 00000000..2024c8ae --- /dev/null +++ b/sprout/operation/resize.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_RESIZE_HPP +#define SPROUT_OPERATION_RESIZE_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_RESIZE_HPP diff --git a/sprout/operation/resize_backward.hpp b/sprout/operation/resize_backward.hpp new file mode 100644 index 00000000..5889e12d --- /dev/null +++ b/sprout/operation/resize_backward.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_OPERATION_RESIZE_BACKWARD_HPP +#define SPROUT_OPERATION_RESIZE_BACKWARD_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_OPERATION_RESIZE_BACKWARD_HPP diff --git a/sprout/range/algorithm.hpp b/sprout/range/algorithm.hpp new file mode 100644 index 00000000..b12bd128 --- /dev/null +++ b/sprout/range/algorithm.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_HPP +#define SPROUT_RANGE_ALGORITHM_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_HPP diff --git a/sprout/range/algorithm/copy.hpp b/sprout/range/algorithm/copy.hpp new file mode 100644 index 00000000..127c19ed --- /dev/null +++ b/sprout/range/algorithm/copy.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_COPY_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_COPY_HPP diff --git a/sprout/range/algorithm/copy_backward.hpp b/sprout/range/algorithm/copy_backward.hpp new file mode 100644 index 00000000..0f61f574 --- /dev/null +++ b/sprout/range/algorithm/copy_backward.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_COPY_BACKWARD_HPP +#define SPROUT_RANGE_ALGORITHM_COPY_BACKWARD_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_COPY_BACKWARD_HPP diff --git a/sprout/range/algorithm/copy_if.hpp b/sprout/range/algorithm/copy_if.hpp new file mode 100644 index 00000000..09deea1c --- /dev/null +++ b/sprout/range/algorithm/copy_if.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_COPY_IF_HPP +#define SPROUT_RANGE_ALGORITHM_COPY_IF_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_COPY_IF_HPP diff --git a/sprout/range/algorithm/fixed.hpp b/sprout/range/algorithm/fixed.hpp new file mode 100644 index 00000000..0fc34326 --- /dev/null +++ b/sprout/range/algorithm/fixed.hpp @@ -0,0 +1,25 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_HPP diff --git a/sprout/range/algorithm/fixed/copy.hpp b/sprout/range/algorithm/fixed/copy.hpp new file mode 100644 index 00000000..2e754ba3 --- /dev/null +++ b/sprout/range/algorithm/fixed/copy.hpp @@ -0,0 +1,27 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_COPY_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type copy( + Input const& input, + Result const& result + ) + { + return sprout::fixed::copy(sprout::begin(input), sprout::end(input), result); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_COPY_HPP diff --git a/sprout/range/algorithm/fixed/copy_backward.hpp b/sprout/range/algorithm/fixed/copy_backward.hpp new file mode 100644 index 00000000..0fa252a2 --- /dev/null +++ b/sprout/range/algorithm/fixed/copy_backward.hpp @@ -0,0 +1,27 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_COPY_BACKWARD_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_COPY_BACKWARD_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // copy_backward + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type copy_backward( + Input const& input, + Result const& result + ) + { + return sprout::fixed::copy_backward(sprout::begin(input), sprout::end(input), result); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_COPY_BACKWARD_HPP diff --git a/sprout/range/algorithm/fixed/copy_if.hpp b/sprout/range/algorithm/fixed/copy_if.hpp new file mode 100644 index 00000000..4d5fbd34 --- /dev/null +++ b/sprout/range/algorithm/fixed/copy_if.hpp @@ -0,0 +1,27 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_COPY_IF_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_COPY_IF_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // copy_if + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type copy_if( + Input const& input, + Result const& result + ) + { + return sprout::fixed::copy_if(sprout::begin(input), sprout::end(input), result); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_COPY_IF_HPP diff --git a/sprout/range/algorithm/fixed/merge.hpp b/sprout/range/algorithm/fixed/merge.hpp new file mode 100644 index 00000000..4082df58 --- /dev/null +++ b/sprout/range/algorithm/fixed/merge.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_MERGE_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_MERGE_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // merge + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type merge( + Input1 const& input1, + Input2 const& input2, + Result const& result, + Compare comp + ) + { + return sprout::fixed::merge(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result, comp); + } + + // + // merge + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type merge( + Input1 const& input1, + Input2 const& input2, + Result const& result + ) + { + return sprout::fixed::merge(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_MERGE_HPP diff --git a/sprout/range/algorithm/fixed/partition_copy.hpp b/sprout/range/algorithm/fixed/partition_copy.hpp new file mode 100644 index 00000000..04abf3c5 --- /dev/null +++ b/sprout/range/algorithm/fixed/partition_copy.hpp @@ -0,0 +1,28 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_PARTITION_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_PARTITION_COPY_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // partition_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type partition_copy( + Input const& input, + Result const& result, + Predicate pred + ) + { + return sprout::fixed::partition_copy(sprout::begin(input), sprout::end(input), result, pred); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_PARTITION_COPY_HPP diff --git a/sprout/range/algorithm/fixed/remove_copy.hpp b/sprout/range/algorithm/fixed/remove_copy.hpp new file mode 100644 index 00000000..5ff04f56 --- /dev/null +++ b/sprout/range/algorithm/fixed/remove_copy.hpp @@ -0,0 +1,28 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_REMOVE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_REMOVE_COPY_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // remove_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type remove_copy( + Input const& input, + Result const& result, + T const& value + ) + { + return sprout::fixed::remove_copy(sprout::begin(input), sprout::end(input), result, value); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_REMOVE_COPY_HPP diff --git a/sprout/range/algorithm/fixed/remove_copy_if.hpp b/sprout/range/algorithm/fixed/remove_copy_if.hpp new file mode 100644 index 00000000..6f54fc78 --- /dev/null +++ b/sprout/range/algorithm/fixed/remove_copy_if.hpp @@ -0,0 +1,28 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_REMOVE_COPY_IF_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_REMOVE_COPY_IF_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // remove_copy_if + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type remove_copy_if( + Input const& input, + Result const& result, + Predicate pred + ) + { + return sprout::fixed::remove_copy_if(sprout::begin(input), sprout::end(input), result, pred); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_REMOVE_COPY_IF_HPP diff --git a/sprout/range/algorithm/fixed/replace_copy.hpp b/sprout/range/algorithm/fixed/replace_copy.hpp new file mode 100644 index 00000000..fa648619 --- /dev/null +++ b/sprout/range/algorithm/fixed/replace_copy.hpp @@ -0,0 +1,29 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_REPLACE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_REPLACE_COPY_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // replace_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type replace_copy( + Input const& input, + Result const& result, + T const& old_value, + T const& new_value + ) + { + return sprout::fixed::replace_copy(sprout::begin(input), sprout::end(input), result, old_value, new_value); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_REPLACE_COPY_HPP diff --git a/sprout/range/algorithm/fixed/replace_copy_if.hpp b/sprout/range/algorithm/fixed/replace_copy_if.hpp new file mode 100644 index 00000000..45b78c4e --- /dev/null +++ b/sprout/range/algorithm/fixed/replace_copy_if.hpp @@ -0,0 +1,29 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_REPLACE_COPY_IF_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_REPLACE_COPY_IF_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // replace_copy_if + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type replace_copy_if( + Input const& input, + Result const& result, + Predicate pred, + T const& new_value + ) + { + return sprout::fixed::replace_copy_if(sprout::begin(input), sprout::end(input), result, pred, new_value); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_REPLACE_COPY_IF_HPP diff --git a/sprout/range/algorithm/fixed/reverse_copy.hpp b/sprout/range/algorithm/fixed/reverse_copy.hpp new file mode 100644 index 00000000..27b7e603 --- /dev/null +++ b/sprout/range/algorithm/fixed/reverse_copy.hpp @@ -0,0 +1,27 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_REVERSE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_REVERSE_COPY_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // reverse_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type reverse_copy( + Input const& input, + Result const& result + ) + { + return sprout::fixed::reverse_copy(sprout::begin(input), sprout::end(input), result); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_REVERSE_COPY_HPP diff --git a/sprout/range/algorithm/fixed/rotate_copy.hpp b/sprout/range/algorithm/fixed/rotate_copy.hpp new file mode 100644 index 00000000..db5f6527 --- /dev/null +++ b/sprout/range/algorithm/fixed/rotate_copy.hpp @@ -0,0 +1,28 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_ROTATE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_ROTATE_COPY_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // rotate_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type rotate_copy( + Input const& input, + typename sprout::fixed_container_traits::const_iterator middle, + Result const& result + ) + { + return sprout::fixed::rotate_copy(sprout::begin(input), middle, sprout::end(input), result); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_ROTATE_COPY_HPP diff --git a/sprout/range/algorithm/fixed/set_difference.hpp b/sprout/range/algorithm/fixed/set_difference.hpp new file mode 100644 index 00000000..c28536ed --- /dev/null +++ b/sprout/range/algorithm/fixed/set_difference.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_SET_DIFFERENCE_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_SET_DIFFERENCE_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // set_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_difference( + Input1 const& input1, + Input2 const& input2, + Result const& result, + Compare comp + ) + { + return sprout::fixed::set_difference(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result, comp); + } + + // + // set_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_difference( + Input1 const& input1, + Input2 const& input2, + Result const& result + ) + { + return sprout::fixed::set_difference(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_SET_DIFFERENCE_HPP diff --git a/sprout/range/algorithm/fixed/set_intersection.hpp b/sprout/range/algorithm/fixed/set_intersection.hpp new file mode 100644 index 00000000..e80f1853 --- /dev/null +++ b/sprout/range/algorithm/fixed/set_intersection.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_SET_INTERSECTION_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_SET_INTERSECTION_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // set_intersection + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_intersection( + Input1 const& input1, + Input2 const& input2, + Result const& result, + Compare comp + ) + { + return sprout::fixed::set_intersection(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result, comp); + } + + // + // set_intersection + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_intersection( + Input1 const& input1, + Input2 const& input2, + Result const& result + ) + { + return sprout::fixed::set_intersection(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_SET_INTERSECTION_HPP diff --git a/sprout/range/algorithm/fixed/set_symmetric_difference.hpp b/sprout/range/algorithm/fixed/set_symmetric_difference.hpp new file mode 100644 index 00000000..92df26ed --- /dev/null +++ b/sprout/range/algorithm/fixed/set_symmetric_difference.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_SET_SYMMETRIC_DIFFERENCE_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_SET_SYMMETRIC_DIFFERENCE_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // set_symmetric_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_symmetric_difference( + Input1 const& input1, + Input2 const& input2, + Result const& result, + Compare comp + ) + { + return sprout::fixed::set_symmetric_difference(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result, comp); + } + + // + // set_symmetric_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_symmetric_difference( + Input1 const& input1, + Input2 const& input2, + Result const& result + ) + { + return sprout::fixed::set_symmetric_difference(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_SET_SYMMETRIC_DIFFERENCE_HPP diff --git a/sprout/range/algorithm/fixed/set_union.hpp b/sprout/range/algorithm/fixed/set_union.hpp new file mode 100644 index 00000000..8574ed33 --- /dev/null +++ b/sprout/range/algorithm/fixed/set_union.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_SET_UNION_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_SET_UNION_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // set_union + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_union( + Input1 const& input1, + Input2 const& input2, + Result const& result, + Compare comp + ) + { + return sprout::fixed::set_union(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result, comp); + } + + // + // set_union + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_union( + Input1 const& input1, + Input2 const& input2, + Result const& result + ) + { + return sprout::fixed::set_union(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_SET_UNION_HPP diff --git a/sprout/range/algorithm/fixed/stable_partition_copy.hpp b/sprout/range/algorithm/fixed/stable_partition_copy.hpp new file mode 100644 index 00000000..76eacda8 --- /dev/null +++ b/sprout/range/algorithm/fixed/stable_partition_copy.hpp @@ -0,0 +1,28 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_STABLE_PARTITION_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_STABLE_PARTITION_COPY_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // stable_partition_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type stable_partition_copy( + Input const& input, + Result const& result, + Predicate pred + ) + { + return sprout::fixed::stable_partition_copy(sprout::begin(input), sprout::end(input), result, pred); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_STABLE_PARTITION_COPY_HPP diff --git a/sprout/range/algorithm/fixed/swap_element_copy.hpp b/sprout/range/algorithm/fixed/swap_element_copy.hpp new file mode 100644 index 00000000..a8b5c017 --- /dev/null +++ b/sprout/range/algorithm/fixed/swap_element_copy.hpp @@ -0,0 +1,29 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_SWAP_ELEMENT_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_SWAP_ELEMENT_COPY_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // swap_element_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type swap_element_copy( + Input const& input, + Result const& result, + typename sprout::fixed_container_traits::const_iterator pos1, + typename sprout::fixed_container_traits::const_iterator pos2 + ) + { + return sprout::fixed::swap_element_copy(sprout::begin(input), sprout::end(input), result, pos1, pos2); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_SWAP_ELEMENT_COPY_HPP diff --git a/sprout/range/algorithm/fixed/transform.hpp b/sprout/range/algorithm/fixed/transform.hpp new file mode 100644 index 00000000..a1be4838 --- /dev/null +++ b/sprout/range/algorithm/fixed/transform.hpp @@ -0,0 +1,43 @@ +#ifndef SPROUT_RANGE_ALGORITHM_TRANSFORM_HPP +#define SPROUT_RANGE_ALGORITHM_TRANSFORM_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // transform + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type transform( + Input const& input, + Result const& result, + UnaryOperation op + ) + { + return sprout::fixed::transform(sprout::begin(input), sprout::end(input), result, op)); + } + + // + // transform + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type transform( + Input1 const& input1, + Input2 const& input2, + Result const& result, + BinaryOperation op + ) + { + return sprout::fixed::transform(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), result, op); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_TRANSFORM_HPP diff --git a/sprout/range/algorithm/fixed/unique_copy.hpp b/sprout/range/algorithm/fixed/unique_copy.hpp new file mode 100644 index 00000000..a03bda68 --- /dev/null +++ b/sprout/range/algorithm/fixed/unique_copy.hpp @@ -0,0 +1,40 @@ +#ifndef SPROUT_RANGE_ALGORITHM_FIXED_UNIQUE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_FIXED_UNIQUE_COPY_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace fixed { + // + // unique_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type unique_copy( + Input const& input, + Result const& result + ) + { + return sprout::fixed::unique_copy(sprout::begin(input), sprout::end(input), result); + } + + // + // unique_copy + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type unique_copy( + Input const& input, + Result const& result, + BinaryPredicate pred + ) + { + return sprout::fixed::unique_copy(sprout::begin(input), sprout::end(input), result, pred); + } + } // namespace fixed + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_FIXED_UNIQUE_COPY_HPP diff --git a/sprout/range/algorithm/infit.hpp b/sprout/range/algorithm/infit.hpp new file mode 100644 index 00000000..0b820a2d --- /dev/null +++ b/sprout/range/algorithm/infit.hpp @@ -0,0 +1,25 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFIT_HPP +#define SPROUT_RANGE_ALGORITHM_INFIT_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFIT_HPP diff --git a/sprout/range/algorithm/infit/copy.hpp b/sprout/range/algorithm/infit/copy.hpp new file mode 100644 index 00000000..16362173 --- /dev/null +++ b/sprout/range/algorithm/infit/copy.hpp @@ -0,0 +1,28 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFIT_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_INFIT_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy( + Input const& input, + Result const& result + ) + { + return sprout::infit::copy(sprout::begin(input), sprout::end(input), result); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFIT_COPY_HPP diff --git a/sprout/range/algorithm/infit/copy_backward.hpp b/sprout/range/algorithm/infit/copy_backward.hpp new file mode 100644 index 00000000..e453bd75 --- /dev/null +++ b/sprout/range/algorithm/infit/copy_backward.hpp @@ -0,0 +1,28 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFIT_COPY_BACKWARD_HPP +#define SPROUT_RANGE_ALGORITHM_INFIT_COPY_BACKWARD_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // copy_backward + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy_backward( + Input const& input, + Result const& result + ) + { + return sprout::infit::copy_backward(sprout::begin(input), sprout::end(input), result); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFIT_COPY_BACKWARD_HPP diff --git a/sprout/range/algorithm/infit/copy_if.hpp b/sprout/range/algorithm/infit/copy_if.hpp new file mode 100644 index 00000000..071a6e4d --- /dev/null +++ b/sprout/range/algorithm/infit/copy_if.hpp @@ -0,0 +1,28 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFIT_COPY_IF_HPP +#define SPROUT_RANGE_ALGORITHM_INFIT_COPY_IF_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // copy_if + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy_if( + Input const& input, + Result const& result + ) + { + return sprout::infit::copy_if(sprout::begin(input), sprout::end(input), result); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFIT_COPY_IF_HPP diff --git a/sprout/range/algorithm/infit/merge.hpp b/sprout/range/algorithm/infit/merge.hpp new file mode 100644 index 00000000..af7f8013 --- /dev/null +++ b/sprout/range/algorithm/infit/merge.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFOT_MERGE_HPP +#define SPROUT_RANGE_ALGORITHM_INFOT_MERGE_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // merge + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type merge( + Input1 const& input1, + Input2 const& input2, + Result const& result, + Compare comp + ) + { + return sprout::infit::merge(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result, comp); + } + + // + // merge + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type merge( + Input1 const& input1, + Input2 const& input2, + Result const& result + ) + { + return sprout::infit::merge(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFOT_MERGE_HPP diff --git a/sprout/range/algorithm/infit/partition_copy.hpp b/sprout/range/algorithm/infit/partition_copy.hpp new file mode 100644 index 00000000..6121535d --- /dev/null +++ b/sprout/range/algorithm/infit/partition_copy.hpp @@ -0,0 +1,29 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFIT_PARTITION_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_INFIT_PARTITION_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // partition_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> partition_copy( + Input const& input, + Result const& result, + Predicate pred + ) + { + return sprout::infit::partition_copy(sprout::begin(input), sprout::end(input), result, pred); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFIT_PARTITION_COPY_HPP diff --git a/sprout/range/algorithm/infit/remove_copy.hpp b/sprout/range/algorithm/infit/remove_copy.hpp new file mode 100644 index 00000000..7fb431cb --- /dev/null +++ b/sprout/range/algorithm/infit/remove_copy.hpp @@ -0,0 +1,29 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFIT_REMOVE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_INFIT_REMOVE_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // remove_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove_copy( + Input const& input, + Result const& result, + T const& value + ) + { + return sprout::infit::remove_copy(sprout::begin(input), sprout::end(input), result, value); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFIT_REMOVE_COPY_HPP diff --git a/sprout/range/algorithm/infit/remove_copy_if.hpp b/sprout/range/algorithm/infit/remove_copy_if.hpp new file mode 100644 index 00000000..cf4da7e3 --- /dev/null +++ b/sprout/range/algorithm/infit/remove_copy_if.hpp @@ -0,0 +1,29 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFIT_REMOVE_COPY_IF_HPP +#define SPROUT_RANGE_ALGORITHM_INFIT_REMOVE_COPY_IF_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // remove_copy_if + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove_copy_if( + Input const& input, + Result const& result, + Predicate pred + ) + { + return sprout::infit::remove_copy_if(sprout::begin(input), sprout::end(input), result, pred); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFIT_REMOVE_COPY_IF_HPP diff --git a/sprout/range/algorithm/infit/replace_copy.hpp b/sprout/range/algorithm/infit/replace_copy.hpp new file mode 100644 index 00000000..c0c52300 --- /dev/null +++ b/sprout/range/algorithm/infit/replace_copy.hpp @@ -0,0 +1,30 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFIT_REPLACE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_INFIT_REPLACE_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // replace_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace_copy( + Input const& input, + Result const& result, + T const& old_value, + T const& new_value + ) + { + return sprout::infit::replace_copy(sprout::begin(input), sprout::end(input), result, old_value, new_value); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFIT_REPLACE_COPY_HPP diff --git a/sprout/range/algorithm/infit/replace_copy_if.hpp b/sprout/range/algorithm/infit/replace_copy_if.hpp new file mode 100644 index 00000000..e5ca3166 --- /dev/null +++ b/sprout/range/algorithm/infit/replace_copy_if.hpp @@ -0,0 +1,30 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFIT_REPLACE_COPY_IF_HPP +#define SPROUT_RANGE_ALGORITHM_INFIT_REPLACE_COPY_IF_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // replace_copy_if + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace_copy_if( + Input const& input, + Result const& result, + Predicate pred, + T const& new_value + ) + { + return sprout::infit::replace_copy_if(sprout::begin(input), sprout::end(input), result, pred, new_value); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFIT_REPLACE_COPY_IF_HPP diff --git a/sprout/range/algorithm/infit/reverse_copy.hpp b/sprout/range/algorithm/infit/reverse_copy.hpp new file mode 100644 index 00000000..d3b9791d --- /dev/null +++ b/sprout/range/algorithm/infit/reverse_copy.hpp @@ -0,0 +1,28 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFIT_REVERSE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_INFIT_REVERSE_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // reverse_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> reverse_copy( + Input const& input, + Result const& result + ) + { + return sprout::infit::reverse_copy(sprout::begin(input), sprout::end(input), result); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFIT_REVERSE_COPY_HPP diff --git a/sprout/range/algorithm/infit/rotate_copy.hpp b/sprout/range/algorithm/infit/rotate_copy.hpp new file mode 100644 index 00000000..9bcbc512 --- /dev/null +++ b/sprout/range/algorithm/infit/rotate_copy.hpp @@ -0,0 +1,29 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFIT_ROTATE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_INFIT_ROTATE_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // rotate_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> rotate_copy( + Input const& input, + typename sprout::fixed_container_traits::const_iterator middle, + Result const& result + ) + { + return sprout::infit::rotate_copy(sprout::begin(input), middle, sprout::end(input), result); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFIT_ROTATE_COPY_HPP diff --git a/sprout/range/algorithm/infit/set_difference.hpp b/sprout/range/algorithm/infit/set_difference.hpp new file mode 100644 index 00000000..f6be7c5c --- /dev/null +++ b/sprout/range/algorithm/infit/set_difference.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFOT_SET_DIFFERENCE_HPP +#define SPROUT_RANGE_ALGORITHM_INFOT_SET_DIFFERENCE_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // set_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_difference( + Input1 const& input1, + Input2 const& input2, + Result const& result, + Compare comp + ) + { + return sprout::infit::set_difference(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result, comp); + } + + // + // set_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_difference( + Input1 const& input1, + Input2 const& input2, + Result const& result + ) + { + return sprout::infit::set_difference(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFOT_SET_DIFFERENCE_HPP diff --git a/sprout/range/algorithm/infit/set_intersection.hpp b/sprout/range/algorithm/infit/set_intersection.hpp new file mode 100644 index 00000000..5fc6452f --- /dev/null +++ b/sprout/range/algorithm/infit/set_intersection.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFOT_SET_INTERSECTION_HPP +#define SPROUT_RANGE_ALGORITHM_INFOT_SET_INTERSECTION_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // set_intersection + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_intersection( + Input1 const& input1, + Input2 const& input2, + Result const& result, + Compare comp + ) + { + return sprout::infit::set_intersection(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result, comp); + } + + // + // set_intersection + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_intersection( + Input1 const& input1, + Input2 const& input2, + Result const& result + ) + { + return sprout::infit::set_intersection(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFOT_SET_INTERSECTION_HPP diff --git a/sprout/range/algorithm/infit/set_symmetric_difference.hpp b/sprout/range/algorithm/infit/set_symmetric_difference.hpp new file mode 100644 index 00000000..dab6ceba --- /dev/null +++ b/sprout/range/algorithm/infit/set_symmetric_difference.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFOT_SET_SYMMETRIC_DIFFERENCE_HPP +#define SPROUT_RANGE_ALGORITHM_INFOT_SET_SYMMETRIC_DIFFERENCE_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // set_symmetric_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_symmetric_difference( + Input1 const& input1, + Input2 const& input2, + Result const& result, + Compare comp + ) + { + return sprout::infit::set_symmetric_difference(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result, comp); + } + + // + // set_symmetric_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_symmetric_difference( + Input1 const& input1, + Input2 const& input2, + Result const& result + ) + { + return sprout::infit::set_symmetric_difference(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFOT_SET_SYMMETRIC_DIFFERENCE_HPP diff --git a/sprout/range/algorithm/infit/set_union.hpp b/sprout/range/algorithm/infit/set_union.hpp new file mode 100644 index 00000000..f9666bde --- /dev/null +++ b/sprout/range/algorithm/infit/set_union.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFOT_SET_UNION_HPP +#define SPROUT_RANGE_ALGORITHM_INFOT_SET_UNION_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // set_union + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_union( + Input1 const& input1, + Input2 const& input2, + Result const& result, + Compare comp + ) + { + return sprout::infit::set_union(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result, comp); + } + + // + // set_union + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_union( + Input1 const& input1, + Input2 const& input2, + Result const& result + ) + { + return sprout::infit::set_union(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFOT_SET_UNION_HPP diff --git a/sprout/range/algorithm/infit/stable_partition_copy.hpp b/sprout/range/algorithm/infit/stable_partition_copy.hpp new file mode 100644 index 00000000..b12a2a24 --- /dev/null +++ b/sprout/range/algorithm/infit/stable_partition_copy.hpp @@ -0,0 +1,29 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFIT_STABLE_PARTITION_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_INFIT_STABLE_PARTITION_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // stable_partition_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> stable_partition_copy( + Input const& input, + Result const& result, + Predicate pred + ) + { + return sprout::infit::stable_partition_copy(sprout::begin(input), sprout::end(input), result, pred); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFIT_STABLE_PARTITION_COPY_HPP diff --git a/sprout/range/algorithm/infit/swap_element_copy.hpp b/sprout/range/algorithm/infit/swap_element_copy.hpp new file mode 100644 index 00000000..41707116 --- /dev/null +++ b/sprout/range/algorithm/infit/swap_element_copy.hpp @@ -0,0 +1,30 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFIT_SWAP_ELEMENT_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_INFIT_SWAP_ELEMENT_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // swap_element_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> swap_element_copy( + Input const& input, + Result const& result, + typename sprout::fixed_container_traits::const_iterator pos1, + typename sprout::fixed_container_traits::const_iterator pos2 + ) + { + return sprout::infit::swap_element_copy(sprout::begin(input), sprout::end(input), result, pos1, pos2); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFIT_SWAP_ELEMENT_COPY_HPP diff --git a/sprout/range/algorithm/infit/transform.hpp b/sprout/range/algorithm/infit/transform.hpp new file mode 100644 index 00000000..386fa0c8 --- /dev/null +++ b/sprout/range/algorithm/infit/transform.hpp @@ -0,0 +1,43 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFIT_TRANSFORM_HPP +#define SPROUT_RANGE_ALGORITHM_INFIT_TRANSFORM_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // transform + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type transform( + Input const& input, + Result const& result, + UnaryOperation op + ) + { + return sprout::infit::transform(sprout::begin(input), sprout::end(input), result, op)); + } + + // + // transform + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type transform( + Input1 const& input1, + Input2 const& input2, + Result const& result, + BinaryOperation op + ) + { + return sprout::infit::transform(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), result, op); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFIT_TRANSFORM_HPP diff --git a/sprout/range/algorithm/infit/unique_copy.hpp b/sprout/range/algorithm/infit/unique_copy.hpp new file mode 100644 index 00000000..92723cec --- /dev/null +++ b/sprout/range/algorithm/infit/unique_copy.hpp @@ -0,0 +1,41 @@ +#ifndef SPROUT_RANGE_ALGORITHM_INFIT_UNIQUE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_INFIT_UNIQUE_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace infit { + // + // unique_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique_copy( + Input const& input, + Result const& result + ) + { + return sprout::infit::unique_copy(sprout::begin(input), sprout::end(input), result); + } + + // + // unique_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique_copy( + Input const& input, + Result const& result, + BinaryPredicate pred + ) + { + return sprout::infit::unique_copy(sprout::begin(input), sprout::end(input), result, pred); + } + } // namespace infit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_INFIT_UNIQUE_COPY_HPP diff --git a/sprout/range/algorithm/merge.hpp b/sprout/range/algorithm/merge.hpp new file mode 100644 index 00000000..eadf7228 --- /dev/null +++ b/sprout/range/algorithm/merge.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_MERGE_HPP +#define SPROUT_RANGE_ALGORITHM_MERGE_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_MERGE_HPP diff --git a/sprout/range/algorithm/outfit.hpp b/sprout/range/algorithm/outfit.hpp new file mode 100644 index 00000000..4504aff3 --- /dev/null +++ b/sprout/range/algorithm/outfit.hpp @@ -0,0 +1,25 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_HPP diff --git a/sprout/range/algorithm/outfit/copy.hpp b/sprout/range/algorithm/outfit/copy.hpp new file mode 100644 index 00000000..36553b44 --- /dev/null +++ b/sprout/range/algorithm/outfit/copy.hpp @@ -0,0 +1,28 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy( + Input const& input, + Result const& result + ) + { + return sprout::outfit::copy(sprout::begin(input), sprout::end(input), result); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_COPY_HPP diff --git a/sprout/range/algorithm/outfit/copy_backward.hpp b/sprout/range/algorithm/outfit/copy_backward.hpp new file mode 100644 index 00000000..cb4947c8 --- /dev/null +++ b/sprout/range/algorithm/outfit/copy_backward.hpp @@ -0,0 +1,28 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_COPY_BACKWARD_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_COPY_BACKWARD_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // copy_backward + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy_backward( + Input const& input, + Result const& result + ) + { + return sprout::outfit::copy_backward(sprout::begin(input), sprout::end(input), result); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_COPY_BACKWARD_HPP diff --git a/sprout/range/algorithm/outfit/copy_if.hpp b/sprout/range/algorithm/outfit/copy_if.hpp new file mode 100644 index 00000000..9880ade0 --- /dev/null +++ b/sprout/range/algorithm/outfit/copy_if.hpp @@ -0,0 +1,29 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_COPY_IF_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_COPY_IF_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // copy_if + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> copy_if( + Input const& input, + Result const& result, + Predicate pred + ) + { + return sprout::outfit::copy_if(sprout::begin(input), sprout::end(input), result, pred); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_COPY_IF_HPP diff --git a/sprout/range/algorithm/outfit/merge.hpp b/sprout/range/algorithm/outfit/merge.hpp new file mode 100644 index 00000000..694b227b --- /dev/null +++ b/sprout/range/algorithm/outfit/merge.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_MERGE_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_MERGE_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // merge + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type merge( + Input1 const& input1, + Input2 const& input2, + Result const& result, + Compare comp + ) + { + return sprout::outfit::merge(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result, comp); + } + + // + // merge + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type merge( + Input1 const& input1, + Input2 const& input2, + Result const& result + ) + { + return sprout::outfit::merge(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_MERGE_HPP diff --git a/sprout/range/algorithm/outfit/partition_copy.hpp b/sprout/range/algorithm/outfit/partition_copy.hpp new file mode 100644 index 00000000..71576a54 --- /dev/null +++ b/sprout/range/algorithm/outfit/partition_copy.hpp @@ -0,0 +1,29 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_PARTITION_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_PARTITION_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // partition_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> partition_copy( + Input const& input, + Result const& result, + Predicate pred + ) + { + return sprout::outfit::partition_copy(sprout::begin(input), sprout::end(input), result, pred); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_PARTITION_COPY_HPP diff --git a/sprout/range/algorithm/outfit/remove_copy.hpp b/sprout/range/algorithm/outfit/remove_copy.hpp new file mode 100644 index 00000000..0bf19ae8 --- /dev/null +++ b/sprout/range/algorithm/outfit/remove_copy.hpp @@ -0,0 +1,29 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_REMOVE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_REMOVE_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // remove_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove_copy( + Input const& input, + Result const& result, + T const& value + ) + { + return sprout::outfit::remove_copy(sprout::begin(input), sprout::end(input), result, value); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_REMOVE_COPY_HPP diff --git a/sprout/range/algorithm/outfit/remove_copy_if.hpp b/sprout/range/algorithm/outfit/remove_copy_if.hpp new file mode 100644 index 00000000..75455961 --- /dev/null +++ b/sprout/range/algorithm/outfit/remove_copy_if.hpp @@ -0,0 +1,29 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_REMOVE_COPY_IF_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_REMOVE_COPY_IF_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // remove_copy_if + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> remove_copy_if( + Input const& input, + Result const& result, + Predicate pred + ) + { + return sprout::outfit::remove_copy_if(sprout::begin(input), sprout::end(input), result, pred); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_REMOVE_COPY_IF_HPP diff --git a/sprout/range/algorithm/outfit/replace_copy.hpp b/sprout/range/algorithm/outfit/replace_copy.hpp new file mode 100644 index 00000000..78de5a8c --- /dev/null +++ b/sprout/range/algorithm/outfit/replace_copy.hpp @@ -0,0 +1,30 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_REPLACE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_REPLACE_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // replace_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace_copy( + Input const& input, + Result const& result, + T const& old_value, + T const& new_value + ) + { + return sprout::outfit::replace_copy(sprout::begin(input), sprout::end(input), result, old_value, new_value); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_REPLACE_COPY_HPP diff --git a/sprout/range/algorithm/outfit/replace_copy_if.hpp b/sprout/range/algorithm/outfit/replace_copy_if.hpp new file mode 100644 index 00000000..f8186348 --- /dev/null +++ b/sprout/range/algorithm/outfit/replace_copy_if.hpp @@ -0,0 +1,30 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_REPLACE_COPY_IF_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_REPLACE_COPY_IF_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // replace_copy_if + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> replace_copy_if( + Input const& input, + Result const& result, + Predicate pred, + T const& new_value + ) + { + return sprout::outfit::replace_copy_if(sprout::begin(input), sprout::end(input), result, pred, new_value); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_REPLACE_COPY_IF_HPP diff --git a/sprout/range/algorithm/outfit/reverse_copy.hpp b/sprout/range/algorithm/outfit/reverse_copy.hpp new file mode 100644 index 00000000..b785743e --- /dev/null +++ b/sprout/range/algorithm/outfit/reverse_copy.hpp @@ -0,0 +1,28 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_REVERSE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_REVERSE_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // reverse_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> reverse_copy( + Input const& input, + Result const& result + ) + { + return sprout::outfit::reverse_copy(sprout::begin(input), sprout::end(input), result); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_REVERSE_COPY_HPP diff --git a/sprout/range/algorithm/outfit/rotate_copy.hpp b/sprout/range/algorithm/outfit/rotate_copy.hpp new file mode 100644 index 00000000..f6220409 --- /dev/null +++ b/sprout/range/algorithm/outfit/rotate_copy.hpp @@ -0,0 +1,29 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_ROTATE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_ROTATE_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // rotate_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> rotate_copy( + Input const& input, + typename sprout::fixed_container_traits::const_iterator middle, + Result const& result + ) + { + return sprout::outfit::rotate_copy(sprout::begin(input), middle, sprout::end(input), result); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_ROTATE_COPY_HPP diff --git a/sprout/range/algorithm/outfit/set_difference.hpp b/sprout/range/algorithm/outfit/set_difference.hpp new file mode 100644 index 00000000..b8a5c22f --- /dev/null +++ b/sprout/range/algorithm/outfit/set_difference.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_SET_DIFFERENCE_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_SET_DIFFERENCE_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // set_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_difference( + Input1 const& input1, + Input2 const& input2, + Result const& result, + Compare comp + ) + { + return sprout::outfit::set_difference(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result, comp); + } + + // + // set_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_difference( + Input1 const& input1, + Input2 const& input2, + Result const& result + ) + { + return sprout::outfit::set_difference(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_SET_DIFFERENCE_HPP diff --git a/sprout/range/algorithm/outfit/set_intersection.hpp b/sprout/range/algorithm/outfit/set_intersection.hpp new file mode 100644 index 00000000..07ff5ec6 --- /dev/null +++ b/sprout/range/algorithm/outfit/set_intersection.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_SET_INTERSECTION_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_SET_INTERSECTION_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // set_intersection + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_intersection( + Input1 const& input1, + Input2 const& input2, + Result const& result, + Compare comp + ) + { + return sprout::outfit::set_intersection(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result, comp); + } + + // + // set_intersection + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_intersection( + Input1 const& input1, + Input2 const& input2, + Result const& result + ) + { + return sprout::outfit::set_intersection(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_SET_INTERSECTION_HPP diff --git a/sprout/range/algorithm/outfit/set_symmetric_difference.hpp b/sprout/range/algorithm/outfit/set_symmetric_difference.hpp new file mode 100644 index 00000000..98b0bbd3 --- /dev/null +++ b/sprout/range/algorithm/outfit/set_symmetric_difference.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_SET_SYMMETRIC_DIFFERENCE_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_SET_SYMMETRIC_DIFFERENCE_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // set_symmetric_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_symmetric_difference( + Input1 const& input1, + Input2 const& input2, + Result const& result, + Compare comp + ) + { + return sprout::outfit::set_symmetric_difference(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result, comp); + } + + // + // set_symmetric_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_symmetric_difference( + Input1 const& input1, + Input2 const& input2, + Result const& result + ) + { + return sprout::outfit::set_symmetric_difference(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_SET_SYMMETRIC_DIFFERENCE_HPP diff --git a/sprout/range/algorithm/outfit/set_union.hpp b/sprout/range/algorithm/outfit/set_union.hpp new file mode 100644 index 00000000..32c8b149 --- /dev/null +++ b/sprout/range/algorithm/outfit/set_union.hpp @@ -0,0 +1,42 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_SET_UNION_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_SET_UNION_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // set_union + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_union( + Input1 const& input1, + Input2 const& input2, + Result const& result, + Compare comp + ) + { + return sprout::outfit::set_union(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result, comp); + } + + // + // set_union + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed_container_traits::fixed_container_type set_union( + Input1 const& input1, + Input2 const& input2, + Result const& result + ) + { + return sprout::outfit::set_union(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), sprout::end(input2), result); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_SET_UNION_HPP diff --git a/sprout/range/algorithm/outfit/stable_partition_copy.hpp b/sprout/range/algorithm/outfit/stable_partition_copy.hpp new file mode 100644 index 00000000..cdabc29a --- /dev/null +++ b/sprout/range/algorithm/outfit/stable_partition_copy.hpp @@ -0,0 +1,29 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_STABLE_PARTITION_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_STABLE_PARTITION_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // stable_partition_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> stable_partition_copy( + Input const& input, + Result const& result, + Predicate pred + ) + { + return sprout::outfit::stable_partition_copy(sprout::begin(input), sprout::end(input), result, pred); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_STABLE_PARTITION_COPY_HPP diff --git a/sprout/range/algorithm/outfit/swap_element_copy.hpp b/sprout/range/algorithm/outfit/swap_element_copy.hpp new file mode 100644 index 00000000..91a3039e --- /dev/null +++ b/sprout/range/algorithm/outfit/swap_element_copy.hpp @@ -0,0 +1,30 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_SWAP_ELEMENT_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_SWAP_ELEMENT_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // swap_element_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> swap_element_copy( + Input const& input, + Result const& result, + typename sprout::fixed_container_traits::const_iterator pos1, + typename sprout::fixed_container_traits::const_iterator pos2 + ) + { + return sprout::outfit::swap_element_copy(sprout::begin(input), sprout::end(input), result, pos1, pos2); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_SWAP_ELEMENT_COPY_HPP diff --git a/sprout/range/algorithm/outfit/transform.hpp b/sprout/range/algorithm/outfit/transform.hpp new file mode 100644 index 00000000..0ae30e97 --- /dev/null +++ b/sprout/range/algorithm/outfit/transform.hpp @@ -0,0 +1,43 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_TRANSFORM_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_TRANSFORM_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // transform + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> transform( + Input const& input, + Result const& result, + UnaryOperation op + ) + { + return sprout::outfit::transform(sprout::begin(input), sprout::end(input), result, op)); + } + + // + // transform + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> transform( + Input1 const& input1, + Input2 const& input2, + Result const& result, + BinaryOperation op + ) + { + return sprout::outfit::transform(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), result, op); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_TRANSFORM_HPP diff --git a/sprout/range/algorithm/outfit/unique_copy.hpp b/sprout/range/algorithm/outfit/unique_copy.hpp new file mode 100644 index 00000000..c3937ec8 --- /dev/null +++ b/sprout/range/algorithm/outfit/unique_copy.hpp @@ -0,0 +1,41 @@ +#ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_UNIQUE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_OUTFIT_UNIQUE_COPY_HPP + +#include +#include +#include +#include +#include + +namespace sprout { + namespace range { + namespace outfit { + // + // unique_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique_copy( + Input const& input, + Result const& result + ) + { + return sprout::outfit::unique_copy(sprout::begin(input), sprout::end(input), result); + } + + // + // unique_copy + // + template + SPROUT_CONSTEXPR inline sprout::sub_array::fixed_container_type> unique_copy( + Input const& input, + Result const& result, + BinaryPredicate pred + ) + { + return sprout::outfit::unique_copy(sprout::begin(input), sprout::end(input), result, pred); + } + } // namespace outfit + } // namespace range +} // namespace sprout + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_OUTFIT_UNIQUE_COPY_HPP diff --git a/sprout/range/algorithm/partition_copy.hpp b/sprout/range/algorithm/partition_copy.hpp new file mode 100644 index 00000000..5fd8d1d5 --- /dev/null +++ b/sprout/range/algorithm/partition_copy.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_PARTITION_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_PARTITION_COPY_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_PARTITION_COPY_HPP diff --git a/sprout/range/algorithm/remove_copy.hpp b/sprout/range/algorithm/remove_copy.hpp new file mode 100644 index 00000000..e8587a38 --- /dev/null +++ b/sprout/range/algorithm/remove_copy.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_REMOVE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_REMOVE_COPY_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_REMOVE_COPY_HPP diff --git a/sprout/range/algorithm/remove_copy_if.hpp b/sprout/range/algorithm/remove_copy_if.hpp new file mode 100644 index 00000000..4fe1fa80 --- /dev/null +++ b/sprout/range/algorithm/remove_copy_if.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_REMOVE_COPY_IF_HPP +#define SPROUT_RANGE_ALGORITHM_REMOVE_COPY_IF_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_REMOVE_COPY_IF_HPP diff --git a/sprout/range/algorithm/replace_copy.hpp b/sprout/range/algorithm/replace_copy.hpp new file mode 100644 index 00000000..f8797de1 --- /dev/null +++ b/sprout/range/algorithm/replace_copy.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_REPLACE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_REPLACE_COPY_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_REPLACE_COPY_HPP diff --git a/sprout/range/algorithm/replace_copy_if.hpp b/sprout/range/algorithm/replace_copy_if.hpp new file mode 100644 index 00000000..e10638ea --- /dev/null +++ b/sprout/range/algorithm/replace_copy_if.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_REPLACE_COPY_IF_HPP +#define SPROUT_RANGE_ALGORITHM_REPLACE_COPY_IF_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_REPLACE_COPY_IF_HPP diff --git a/sprout/range/algorithm/reverse_copy.hpp b/sprout/range/algorithm/reverse_copy.hpp new file mode 100644 index 00000000..06fc5491 --- /dev/null +++ b/sprout/range/algorithm/reverse_copy.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_REVERSE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_REVERSE_COPY_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_REVERSE_COPY_HPP diff --git a/sprout/range/algorithm/rotate_copy.hpp b/sprout/range/algorithm/rotate_copy.hpp new file mode 100644 index 00000000..1f1b3bcf --- /dev/null +++ b/sprout/range/algorithm/rotate_copy.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_ROTATE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_ROTATE_COPY_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_ROTATE_COPY_HPP diff --git a/sprout/range/algorithm/set_difference.hpp b/sprout/range/algorithm/set_difference.hpp new file mode 100644 index 00000000..66bd2cd5 --- /dev/null +++ b/sprout/range/algorithm/set_difference.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_SET_DIFFERENCE_HPP +#define SPROUT_RANGE_ALGORITHM_SET_DIFFERENCE_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_SET_DIFFERENCE_HPP diff --git a/sprout/range/algorithm/set_intersection.hpp b/sprout/range/algorithm/set_intersection.hpp new file mode 100644 index 00000000..a0cd3bb6 --- /dev/null +++ b/sprout/range/algorithm/set_intersection.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_SET_INTERSECTION_HPP +#define SPROUT_RANGE_ALGORITHM_SET_INTERSECTION_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_SET_INTERSECTION_HPP diff --git a/sprout/range/algorithm/set_symmetric_difference.hpp b/sprout/range/algorithm/set_symmetric_difference.hpp new file mode 100644 index 00000000..81ceb00a --- /dev/null +++ b/sprout/range/algorithm/set_symmetric_difference.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_SET_SYMMETRIC_DIFFERENCE_HPP +#define SPROUT_RANGE_ALGORITHM_SET_SYMMETRIC_DIFFERENCE_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_SET_SYMMETRIC_DIFFERENCE_HPP diff --git a/sprout/range/algorithm/set_union.hpp b/sprout/range/algorithm/set_union.hpp new file mode 100644 index 00000000..11f99a9e --- /dev/null +++ b/sprout/range/algorithm/set_union.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_SET_UNION_HPP +#define SPROUT_RANGE_ALGORITHM_SET_UNION_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_SET_UNION_HPP diff --git a/sprout/range/algorithm/stable_partition_copy.hpp b/sprout/range/algorithm/stable_partition_copy.hpp new file mode 100644 index 00000000..96116088 --- /dev/null +++ b/sprout/range/algorithm/stable_partition_copy.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_STABLE_PARTITION_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_STABLE_PARTITION_COPY_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_STABLE_PARTITION_COPY_HPP diff --git a/sprout/range/algorithm/swap_element_copy.hpp b/sprout/range/algorithm/swap_element_copy.hpp new file mode 100644 index 00000000..2298a74a --- /dev/null +++ b/sprout/range/algorithm/swap_element_copy.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_SWAP_ELEMENT_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_SWAP_ELEMENT_COPY_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_SWAP_ELEMENT_COPY_HPP diff --git a/sprout/range/algorithm/transform.hpp b/sprout/range/algorithm/transform.hpp new file mode 100644 index 00000000..bb1d8f82 --- /dev/null +++ b/sprout/range/algorithm/transform.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_TRANSFORM_HPP +#define SPROUT_RANGE_ALGORITHM_TRANSFORM_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_TRANSFORM_HPP diff --git a/sprout/range/algorithm/unique_copy.hpp b/sprout/range/algorithm/unique_copy.hpp new file mode 100644 index 00000000..85352c2d --- /dev/null +++ b/sprout/range/algorithm/unique_copy.hpp @@ -0,0 +1,9 @@ +#ifndef SPROUT_RANGE_ALGORITHM_UNIQUE_COPY_HPP +#define SPROUT_RANGE_ALGORITHM_UNIQUE_COPY_HPP + +#include +#include +#include +#include + +#endif // #ifndef SPROUT_RANGE_ALGORITHM_UNIQUE_COPY_HPP diff --git a/sprout/string.hpp b/sprout/string.hpp new file mode 100644 index 00000000..b4fa7f0b --- /dev/null +++ b/sprout/string.hpp @@ -0,0 +1,317 @@ +#ifndef SPROUT_STRING_HPP +#define SPROUT_STRING_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + // + // basic_string + // + template + class basic_string { + public: + typedef T value_type; + typedef T* iterator; + typedef T const* const_iterator; + typedef T& reference; + typedef T const& const_reference; + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + typedef T* pointer; + typedef T const* const_pointer; + typedef sprout::detail::reverse_iterator reverse_iterator; + typedef sprout::detail::reverse_iterator const_reverse_iterator; + public: + static constexpr size_type static_size = N; + static constexpr size_type fixed_size = static_size; + public: + T elems[N + 1]; + public: + SPROUT_CONSTEXPR size_type size() const SPROUT_NOEXCEPT { + return N; + } + SPROUT_CONSTEXPR bool empty() const SPROUT_NOEXCEPT { + return N != 0; + } + SPROUT_CONSTEXPR size_type max_size() const SPROUT_NOEXCEPT { + return size(); + } + void rangecheck(size_type i) const { + if (i >= size()) { + throw std::out_of_range("basic_string<>: index out of range"); + } + } + iterator begin() SPROUT_NOEXCEPT { + return elems; + } + SPROUT_CONSTEXPR const_iterator begin() const SPROUT_NOEXCEPT { + return elems; + } + SPROUT_CONSTEXPR const_iterator cbegin() const SPROUT_NOEXCEPT { + return elems; + } + iterator end() SPROUT_NOEXCEPT { + return elems + size(); + } + SPROUT_CONSTEXPR const_iterator end() const SPROUT_NOEXCEPT { + return elems + size(); + } + SPROUT_CONSTEXPR const_iterator cend() const SPROUT_NOEXCEPT { + return elems + size(); + } + reverse_iterator rbegin() SPROUT_NOEXCEPT { + return reverse_iterator(begin()); + } + SPROUT_CONSTEXPR const_reverse_iterator rbegin() const SPROUT_NOEXCEPT { + return const_reverse_iterator(begin()); + } + SPROUT_CONSTEXPR const_reverse_iterator crbegin() const SPROUT_NOEXCEPT { + return const_reverse_iterator(begin()); + } + reverse_iterator rend() SPROUT_NOEXCEPT { + return reverse_iterator(end()); + } + SPROUT_CONSTEXPR const_reverse_iterator rend() const SPROUT_NOEXCEPT { + return const_reverse_iterator(end()); + } + SPROUT_CONSTEXPR const_reverse_iterator crend() const SPROUT_NOEXCEPT { + return const_reverse_iterator(end()); + } + reference operator[](size_type i) { + return elems[i]; + } + SPROUT_CONSTEXPR const_reference operator[](size_type i) const { + return elems[i]; + } + reference at(size_type i) { + rangecheck(i); + return elems[i]; + } + const_reference at(size_type i) const { + rangecheck(i); + return elems[i]; + } + reference front() { + return elems[0]; + } + SPROUT_CONSTEXPR const_reference front() const { + return elems[size() - 1]; + } + reference back() { + return elems[size() - 1]; + } + SPROUT_CONSTEXPR const_reference back() const { + return elems[0]; + } + pointer data() SPROUT_NOEXCEPT { + return elems; + } + SPROUT_CONSTEXPR const_pointer data() const SPROUT_NOEXCEPT { + return elems; + } + pointer c_array() SPROUT_NOEXCEPT { + return elems; + } + const_pointer c_str() const SPROUT_NOEXCEPT { + return elems; + } + void assign(const_reference value) { + fill(value); + } + void fill(const_reference value) { + std::fill_n(begin(), size(), value); + } + void swap(basic_string& other) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(std::swap(std::declval(), std::declval()))) { + std::swap_ranges(other.begin(), other.end(), begin()); + } + template + basic_string& operator=(basic_string const& rhs) { + std::copy(rhs.begin(), rhs.end(), begin()); + return *this; + } + template + basic_string& operator=(basic_string&& rhs) { + std::move(rhs.begin(), rhs.end(), begin()); + return *this; + } + }; + template + SPROUT_CONSTEXPR inline bool operator==(sprout::basic_string const& lhs, sprout::basic_string const& rhs) { + return N1 == N2 && NS_SSCRISK_CEL_OR_SPROUT_DETAIL::equal(lhs.begin(), lhs.end(), rhs.begin()); + } + template + SPROUT_CONSTEXPR inline bool operator!=(sprout::basic_string const& lhs, sprout::basic_string const& rhs) { + return !(lhs == rhs); + } + template + SPROUT_CONSTEXPR inline bool operator<(sprout::basic_string const& lhs, sprout::basic_string const& rhs) { + return NS_SSCRISK_CEL_OR_SPROUT_DETAIL::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end()); + } + template + SPROUT_CONSTEXPR inline bool operator>(sprout::basic_string const& lhs, sprout::basic_string const& rhs) { + return rhs < lhs; + } + template + SPROUT_CONSTEXPR inline bool operator<=(sprout::basic_string const& lhs, sprout::basic_string const& rhs) { + return !(rhs < lhs); + } + template + SPROUT_CONSTEXPR inline bool operator>=(sprout::basic_string const& lhs, sprout::basic_string const& rhs) { + return !(lhs < rhs); + } + + // + // swap + // + template + SPROUT_CONSTEXPR inline void swap(sprout::basic_string& lhs, sprout::basic_string& rhs) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(lhs.swap(rhs))) { + lhs.swap(rhs); + } + + // + // rebind_fixed_size + // + template + struct rebind_fixed_size > { + public: + template >::size_type S> + struct apply { + public: + typedef sprout::basic_string type; + }; + }; + + namespace detail { + template + SPROUT_CONSTEXPR inline sprout::basic_string to_string_impl( + T const(& arr)[N], + sprout::index_tuple + ) + { + return sprout::basic_string{arr[Indexes]...}; + } + } // namespace detail + // + // to_string + // + template + SPROUT_CONSTEXPR inline sprout::basic_string to_string(T const(& arr)[N]) { + return sprout::detail::to_string_impl(arr, typename sprout::index_range<0, N - 1>::type()); + } + + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::push_back, T>::type operator+( + sprout::basic_string const& lhs, + T const& rhs + ) + { + return sprout::fixed::push_back(lhs, rhs); + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::push_front, T>::type operator+( + T const& lhs, + sprout::basic_string const& rhs + ) + { + return sprout::fixed::push_front(rhs, lhs); + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::join_back, sprout::basic_string >::type operator+( + sprout::basic_string const& lhs, + T const (& rhs)[N2] + ) + { + return sprout::fixed::join_back(lhs, to_string(rhs)); + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::join_front, sprout::basic_string >::type operator+( + T const (& lhs)[N2], + sprout::basic_string const& rhs + ) + { + return sprout::fixed::join_front(rhs, to_string(lhs)); + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::join_back, sprout::basic_string >::type operator+( + sprout::basic_string const& lhs, + sprout::basic_string const& rhs + ) + { + return sprout::fixed::join_back(lhs, rhs); + } + + template + inline std::basic_ostream& operator<<(std::basic_ostream& lhs, sprout::basic_string const& rhs) { + return lhs << rhs.c_str(); + } + +#if 0 + // + // string + // + template + using string = sprout::basic_string; + + // + // wstring + // + template + using wstring = sprout::basic_string; +#endif // #if 0 +} // namespace sprout + +namespace std { + // + // tuple_size + // + template + struct tuple_size > { + public: + typedef std::integral_constant type; + static constexpr std::size_t value = type::value; + }; + + // + // tuple_element + // + template + struct tuple_element > { + public: + static_assert(I < N, "tuple_element<>: index out of range"); + typedef T type; + }; + + // + // get + // + template + T& get(sprout::basic_string& arr) SPROUT_NOEXCEPT { + static_assert(I < N, "tuple_element<>: index out of range"); + return arr[I]; + } + template + SPROUT_CONSTEXPR T const& get(sprout::basic_string const& arr) SPROUT_NOEXCEPT { + static_assert(I < N, "tuple_element<>: index out of range"); + return arr[I]; + } + template + T&& get(sprout::basic_string&& arr) SPROUT_NOEXCEPT { + return std::move(get(arr)); + } +} // namespace std + +#endif // #ifndef SPROUT_STRING_HPP diff --git a/sprout/sub_array.hpp b/sprout/sub_array.hpp new file mode 100644 index 00000000..bcaaf8e8 --- /dev/null +++ b/sprout/sub_array.hpp @@ -0,0 +1,835 @@ +#ifndef SPROUT_SUB_ARRAY_HPP +#define SPROUT_SUB_ARRAY_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace detail { + struct is_non_reference_array_tag {}; + struct is_not_non_reference_array_tag {}; + + template + class sub_array_impl { + protected: + typedef Array array_type; + typedef typename std::remove_reference::type container_type; + typedef typename std::remove_const::type fixed_container_type; + protected: + static constexpr bool is_reference = std::is_reference::value; + static constexpr bool is_const = std::is_const::value; + protected: + typedef typename sprout::fixed_container_traits::value_type value_type; + typedef typename sprout::detail::if_c< + is_const, + typename sprout::fixed_container_traits::const_iterator, + typename sprout::fixed_container_traits::iterator + >::type iterator; + typedef typename sprout::fixed_container_traits::const_iterator const_iterator; + typedef typename sprout::detail::if_c< + is_const, + typename sprout::fixed_container_traits::const_reference, + typename sprout::fixed_container_traits::reference + >::type reference; + typedef typename sprout::fixed_container_traits::const_reference const_reference; + typedef typename sprout::fixed_container_traits::size_type size_type; + typedef typename sprout::fixed_container_traits::difference_type difference_type; + typedef typename sprout::detail::if_c< + is_const, + typename sprout::fixed_container_traits::const_pointer, + typename sprout::fixed_container_traits::pointer + >::type pointer; + typedef typename sprout::fixed_container_traits::const_pointer const_pointer; + protected: + static constexpr size_type static_size = sprout::fixed_container_traits::fixed_size; + static constexpr size_type fixed_size = static_size; + protected: + typedef typename sprout::detail::if_c< + is_reference, + container_type*, + typename std::remove_const::type + >::type holder_type; + typedef typename sprout::detail::if_c< + is_reference, + container_type&, + container_type const& + >::type param_type; + typedef container_type const& const_param_type; + protected: + typedef typename sprout::detail::if_c< + std::is_array::value, + sprout::detail::is_non_reference_array_tag, + sprout::detail::is_not_non_reference_array_tag + >::type array_tag; + protected: + template + static SPROUT_CONSTEXPR typename std::enable_if< + std::is_reference::value, + holder_type + >::type to_holder(param_type arr) { + return &arr; + } + template + static SPROUT_CONSTEXPR typename std::enable_if< + !std::is_reference::value, + holder_type const& + >::type to_holder(param_type arr) { + return arr; + } + template + static SPROUT_CONSTEXPR typename std::enable_if< + std::is_reference::value, + param_type + >::type to_param(holder_type arr) { + return *arr; + } + template + static SPROUT_CONSTEXPR typename std::enable_if< + !std::is_reference::value, + param_type + >::type to_param(holder_type& arr) { + return arr; + } + template + static SPROUT_CONSTEXPR typename std::enable_if< + !std::is_reference::value, + param_type + >::type to_param(holder_type const& arr) { + return arr; + } + template + static SPROUT_CONSTEXPR typename std::enable_if< + std::is_reference::value, + const_param_type + >::type to_const_param(holder_type arr) { + return *arr; + } + template + static SPROUT_CONSTEXPR typename std::enable_if< + !std::is_reference::value, + const_param_type + >::type to_const_param(holder_type const& arr) { + return arr; + } + protected: + holder_type array_; + difference_type first_; + difference_type last_; + public: + sub_array_impl() = default; + protected: + template + SPROUT_CONSTEXPR sub_array_impl( + ArrayTag, + param_type arr, + sprout::index_tuple, + const_iterator first, + const_iterator last, + typename std::enable_if::value>::type* = 0 + ) + : array_{to_holder(arr)[Indexes]...} + , first_(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::cbegin(arr), first)) + , last_(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::cbegin(arr), last)) + {} + template + SPROUT_CONSTEXPR sub_array_impl( + ArrayTag, + param_type arr, + sprout::index_tuple, + const_iterator first, + const_iterator last, + typename std::enable_if::value>::type* = 0 + ) + : array_(to_holder(arr)) + , first_(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::cbegin(arr), first)) + , last_(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::cbegin(arr), last)) + {} + template + SPROUT_CONSTEXPR sub_array_impl( + ArrayTag, + param_type arr, + sprout::index_tuple, + difference_type first, + difference_type last, + typename std::enable_if::value>::type* = 0 + ) + : array_{to_holder(arr)[Indexes]...} + , first_(first) + , last_(last) + {} + template + SPROUT_CONSTEXPR sub_array_impl( + ArrayTag, + param_type arr, + sprout::index_tuple, + difference_type first, + difference_type last, + typename std::enable_if::value>::type* = 0 + ) + : array_(to_holder(arr)) + , first_(first) + , last_(last) + {} + }; + } // namespace detail + + // + // sub_array + // + template + class sub_array + : private sprout::detail::sub_array_impl + { + private: + typedef sprout::detail::sub_array_impl impl_type; + public: + typedef typename impl_type::array_type array_type; + typedef typename impl_type::container_type container_type; + typedef typename impl_type::fixed_container_type fixed_container_type; + public: + static constexpr bool is_reference = impl_type::is_reference; + static constexpr bool is_const = impl_type::is_const; + public: + typedef typename impl_type::value_type value_type; + typedef typename impl_type::iterator iterator; + typedef typename impl_type::const_iterator const_iterator; + typedef typename impl_type::reference reference; + typedef typename impl_type::const_reference const_reference; + typedef typename impl_type::size_type size_type; + typedef typename impl_type::difference_type difference_type; + typedef typename impl_type::pointer pointer; + typedef typename impl_type::const_pointer const_pointer; + public: + static constexpr size_type static_size = impl_type::static_size; + static constexpr size_type fixed_size = impl_type::fixed_size; + public: + typedef typename impl_type::holder_type holder_type; + typedef typename impl_type::param_type param_type; + typedef typename impl_type::const_param_type const_param_type; + private: + typedef typename impl_type::array_tag array_tag; + private: + using impl_type::array_; + using impl_type::first_; + using impl_type::last_; + public: + sub_array() = default; + SPROUT_CONSTEXPR sub_array(param_type arr, const_iterator first, const_iterator last) + : impl_type( + array_tag(), + arr, + typename sprout::index_range<0, fixed_size>::type(), + first, + last + ) + {} + SPROUT_CONSTEXPR sub_array(param_type arr, difference_type first, difference_type last) + : impl_type( + array_tag(), + arr, + typename sprout::index_range<0, fixed_size>::type(), + first, + last + ) + {} + SPROUT_CONSTEXPR sub_array(sub_array const& other, const_iterator first, const_iterator last) + : impl_type( + array_tag(), + impl_type::template to_param(other.array_), + typename sprout::index_range<0, fixed_size>::type(), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::begin(other.get_array()), first), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(sprout::begin(other.get_array()), last) + ) + {} + SPROUT_CONSTEXPR sub_array(sub_array const& other, difference_type first, difference_type last) + : impl_type( + array_tag(), + impl_type::template to_param(other.array_), + typename sprout::index_range<0, fixed_size>::type(), + first + other.first_, + last + other.first_ + ) + {} + param_type get_fixed() { + return impl_type::template to_param(array_); + } + SPROUT_CONSTEXPR const_param_type get_fixed() const { + return impl_type::template to_const_param(array_); + } + SPROUT_CONSTEXPR const_param_type get_cfixed() const { + return impl_type::template to_const_param(array_); + } + param_type get_array() { + return impl_type::template to_param(array_); + } + SPROUT_CONSTEXPR const_param_type get_array() const { + return impl_type::template to_const_param(array_); + } + SPROUT_CONSTEXPR size_type size() const { + return last_ - first_; + } + SPROUT_CONSTEXPR bool empty() const { + return size() != 0; + } + SPROUT_CONSTEXPR size_type max_size() const { + return size(); + } + void rangecheck(size_type i) const { + if (i >= size()) { + //boost::throw_exception(std::out_of_range("sub_array<>: index out of range")); + throw std::out_of_range("sub_array<>: index out of range"); + } + } + iterator begin() { + return sprout::begin(get_array()) + first_; + } + SPROUT_CONSTEXPR const_iterator begin() const { + return sprout::begin(get_array()) + first_; + } + SPROUT_CONSTEXPR const_iterator cbegin() const { + return first_; + } + iterator end() { + return sprout::begin(get_array()) + last_; + } + SPROUT_CONSTEXPR const_iterator end() const { + return sprout::begin(get_array()) + last_; + } + SPROUT_CONSTEXPR const_iterator cend() const { + return sprout::begin(get_array()) + last_; + } + reference operator[](size_type i) { + return *(sprout::begin(get_array()) + first_ + i); + } + SPROUT_CONSTEXPR const_reference operator[](size_type i) const { + return *(sprout::begin(get_array()) + first_ + i); + } + reference at(size_type i) { + rangecheck(i); + return *(sprout::begin(get_array()) + first_ + i); + } + const_reference at(size_type i) const { + rangecheck(i); + return *(sprout::begin(get_array()) + first_ + i); + } + reference front() { + return get_array()[first_]; + } + SPROUT_CONSTEXPR const_reference front() const { + return get_array()[first_]; + } + reference back() { + return get_array()[last_ - 1]; + } + SPROUT_CONSTEXPR const_reference back() const { + return get_array()[last_ - 1]; + } + pointer data() { + return get_array().data() + first_; + } + SPROUT_CONSTEXPR const_pointer data() const { + return get_array().data() + first_; + } + pointer c_array() { + return data(); + } + void assign (const_reference value) { + fill(value); + } + void fill(const_reference value) { + std::fill_n(begin(), size(), value); + } + template + void swap(sub_array& other) { + using std::swap; + swap(other.array_, array_); + swap(other.first_, first_); + swap(other.last_, last_); + } + template + sub_array& operator=(sub_array const& rhs) { + array_ = rhs.array_; + first_ = rhs.first_; + last_ = rhs.last_; + return *this; + } + template + sub_array& operator=(sub_array&& rhs) { + array_ = std::move(rhs.array_); + first_ = std::move(rhs.first_); + last_ = std::move(rhs.last_); + return *this; + } + }; + template + SPROUT_CONSTEXPR inline bool operator==(sprout::sub_array const& lhs, sprout::sub_array const& rhs) { + return NS_SSCRISK_CEL_OR_SPROUT_DETAIL::equal(sprout::begin(lhs), sprout::end(lhs), sprout::begin(rhs)); + } + template + SPROUT_CONSTEXPR inline bool operator!=(sprout::sub_array const& lhs, sprout::sub_array const& rhs) { + return !(lhs == rhs); + } + template + SPROUT_CONSTEXPR inline bool operator<(sprout::sub_array const& lhs, sprout::sub_array const& rhs) { + return NS_SSCRISK_CEL_OR_SPROUT_DETAIL::lexicographical_compare(sprout::begin(lhs), sprout::end(lhs), sprout::begin(rhs), sprout::end(rhs)); + } + template + SPROUT_CONSTEXPR inline bool operator>(sprout::sub_array const& lhs, sprout::sub_array const& rhs) { + return rhs < lhs; + } + template + SPROUT_CONSTEXPR inline bool operator<=(sprout::sub_array const& lhs, sprout::sub_array const& rhs) { + return !(rhs < lhs); + } + template + SPROUT_CONSTEXPR inline bool operator>=(sprout::sub_array const& lhs, sprout::sub_array const& rhs) { + return !(lhs < rhs); + } + + // + // swap + // + template + SPROUT_CONSTEXPR inline void swap(sprout::sub_array& lhs, sprout::sub_array& rhs) { + lhs.swap(rhs); + } + + // + // fixed_container_traits + // + template + struct fixed_container_traits > + : public sprout::detail::fixed_container_traits_base > + { + public: + typedef typename sprout::sub_array::fixed_container_type fixed_container_type; + public: + static constexpr typename sprout::detail::fixed_container_traits_base >::size_type fixed_size + = std::tuple_size::type>::value + ; + }; + + // + // rebind_fixed_size + // + template + struct rebind_fixed_size > { + public: + template >::size_type S> + struct apply { + public: + typedef sprout::sub_array< + typename sprout::rebind_fixed_size< + typename sprout::fixed_container_traits >::fixed_container_type + >::template apply::type + > type; + }; + }; + + // + // get_fixed_functor + // + template + struct get_fixed_functor > { + public: + typename sprout::fixed_container_traits >::fixed_container_type& operator()(sprout::sub_array& cont) const { + return cont.get_fixed(); + } + SPROUT_CONSTEXPR typename sprout::fixed_container_traits >::fixed_container_type const& operator()(sprout::sub_array const& cont) const { + return cont.get_fixed(); + } + }; + + // + // is_sub_array + // + template + struct is_sub_array { + public: + typedef std::integral_constant type; + static constexpr bool value = type::value; + }; + template + struct is_sub_array< + T, + typename std::enable_if< + std::is_same< + T, + sprout::sub_array + >::value + >::type + > { + public: + typedef std::integral_constant type; + static constexpr bool value = type::value; + }; + + // + // sub + // + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub( + Array& arr, + typename sprout::fixed_container_traits >::const_iterator first, + typename sprout::fixed_container_traits >::const_iterator last + ) + { + return sprout::sub_array(arr, first, last); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub( + Array& arr, + typename sprout::fixed_container_traits >::difference_type first, + typename sprout::fixed_container_traits >::difference_type last + ) + { + return sprout::sub_array(arr, first, last); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub( + Array& arr, + typename sprout::fixed_container_traits >::const_iterator first + ) + { + return sprout::sub(arr, first, sprout::end(arr)); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub( + Array& arr, + typename sprout::fixed_container_traits >::difference_type first + ) + { + return sprout::sub(arr, first, sprout::size(arr)); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub( + Array& arr + ) + { + return sprout::sub(arr, sprout::begin(arr), sprout::end(arr)); + } + // + // sub + // + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub( + Array const& arr, + typename sprout::fixed_container_traits >::const_iterator first, + typename sprout::fixed_container_traits >::const_iterator last + ) + { + return sprout::sub_array(arr, first, last); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub( + Array const& arr, + typename sprout::fixed_container_traits >::difference_type first, + typename sprout::fixed_container_traits >::difference_type last + ) + { + return sprout::sub_array(arr, first, last); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub( + Array const& arr, + typename sprout::fixed_container_traits >::const_iterator first + ) + { + return sprout::sub(arr, first, sprout::end(arr)); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub( + Array const& arr, + typename sprout::fixed_container_traits >::difference_type first + ) + { + return sprout::sub(arr, first, sprout::size(arr)); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub( + Array const& arr + ) + { + return sprout::sub(arr, sprout::begin(arr), sprout::end(arr)); + } + // + // sub + // + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, Array>::type sub( + Array const& arr, + typename sprout::fixed_container_traits::const_iterator first, + typename sprout::fixed_container_traits::const_iterator last + ) + { + return Array(arr, first, last); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, Array>::type sub( + Array const& arr, + typename sprout::fixed_container_traits::difference_type first, + typename sprout::fixed_container_traits::difference_type last + ) + { + return Array(arr, first, last); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, Array>::type sub( + Array const& arr, + typename sprout::fixed_container_traits::const_iterator first + ) + { + return sprout::sub(arr, first, sprout::end(arr)); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, Array>::type sub( + Array const& arr, + typename sprout::fixed_container_traits::difference_type first + ) + { + return sprout::sub(arr, first, sprout::size(arr)); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, Array>::type sub( + Array const& arr + ) + { + return sprout::sub(arr, sprout::begin(arr), sprout::end(arr)); + } + + // + // csub + // + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type csub( + Array const& arr, + typename sprout::fixed_container_traits >::const_iterator first, + typename sprout::fixed_container_traits >::const_iterator last + ) + { + return sprout::sub_array(arr, first, last); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type csub( + Array const& arr, + typename sprout::fixed_container_traits >::difference_type first, + typename sprout::fixed_container_traits >::difference_type last + ) + { + return sprout::sub_array(arr, first, last); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type csub( + Array const& arr, + typename sprout::fixed_container_traits >::const_iterator first + ) + { + return sprout::csub(arr, first, sprout::end(arr)); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type csub( + Array const& arr, + typename sprout::fixed_container_traits >::difference_type first + ) + { + return sprout::csub(arr, first, sprout::size(arr)); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type csub( + Array const& arr + ) + { + return sprout::csub(arr, sprout::begin(arr), sprout::end(arr)); + } + // + // csub + // + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type csub( + Array const& arr, + typename sprout::fixed_container_traits::const_iterator first, + typename sprout::fixed_container_traits::const_iterator last + ) + { + return sprout::sub_array(arr.get_array(), first, last); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type csub( + Array const& arr, + typename sprout::fixed_container_traits::difference_type first, + typename sprout::fixed_container_traits::difference_type last + ) + { + return sprout::sub_array(arr.get_array(), sprout::begin(arr) + first, sprout::begin(arr) + last); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type csub( + Array const& arr, + typename sprout::fixed_container_traits::const_iterator first + ) + { + return sprout::csub(arr, first, sprout::end(arr)); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type csub( + Array const& arr, + typename sprout::fixed_container_traits::difference_type first + ) + { + return sprout::csub(arr, first, sprout::size(arr)); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type csub( + Array const& arr + ) + { + return sprout::csub(arr, sprout::begin(arr), sprout::end(arr)); + } + + // + // sub_copy + // + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub_copy( + Array const& arr, + typename sprout::fixed_container_traits::const_iterator first, + typename sprout::fixed_container_traits::const_iterator last + ) + { + return sprout::sub_array(arr, first, last); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub_copy( + Array const& arr, + typename sprout::fixed_container_traits::difference_type first, + typename sprout::fixed_container_traits::difference_type last + ) + { + return sprout::sub_array(arr, first, last); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub_copy( + Array const& arr, + typename sprout::fixed_container_traits::const_iterator first + ) + { + return sprout::sub_copy(arr, first, sprout::end(arr)); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub_copy( + Array const& arr, + typename sprout::fixed_container_traits::difference_type first + ) + { + return sprout::sub_copy(arr, first, sprout::size(arr)); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub_copy( + Array const& arr + ) + { + return sprout::sub_copy(arr, sprout::begin(arr), sprout::end(arr)); + } + // + // sub_copy + // + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub_copy( + Array const& arr, + typename sprout::fixed_container_traits::const_iterator first, + typename sprout::fixed_container_traits::const_iterator last + ) + { + return sprout::sub_array(arr.get_array(), first, last); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub_copy( + Array const& arr, + typename sprout::fixed_container_traits::difference_type first, + typename sprout::fixed_container_traits::difference_type last + ) + { + return sprout::sub_array(arr.get_array(), sprout::begin(arr) + first, sprout::begin(arr) + last); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub_copy( + Array const& arr, + typename sprout::fixed_container_traits::const_iterator first + ) + { + return sprout::sub_copy(arr, first, sprout::end(arr)); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub_copy( + Array const& arr, + typename sprout::fixed_container_traits::difference_type first + ) + { + return sprout::sub_copy(arr, first, sprout::size(arr)); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if::value, sprout::sub_array >::type sub_copy( + Array const& arr + ) + { + return sprout::sub_copy(arr, sprout::begin(arr), sprout::end(arr)); + } +} // namespace sprout + +namespace std { + // + // tuple_size + // + template + struct tuple_size > { + public: + static constexpr std::size_t value = std::tuple_size< + typename std::remove_const< + typename std::remove_reference::type + >::type + >::value; + }; + + // + // tuple_element + // + template + struct tuple_element > { + public: + typedef typename std::tuple_element< + I, + typename std::remove_const< + typename std::remove_reference::type + >::type + >::type type; + }; + + // + // get + // + template + T& get(sprout::sub_array& arr) SPROUT_NOEXCEPT { + static_assert(I < sprout::fixed_container_traits >::fixed_size, "tuple_element<>: index out of range"); + return *(sprout::fixed_begin(arr) + I); + } + template + SPROUT_CONSTEXPR T const& get(sprout::sub_array const& arr) SPROUT_NOEXCEPT { + static_assert(I < sprout::fixed_container_traits >::fixed_size, "tuple_element<>: index out of range"); + return *(sprout::fixed_begin(arr) + I); + } + template + T&& get(sprout::sub_array&& arr) SPROUT_NOEXCEPT { + return std::move(get(arr)); + } +} // namespace std + +#endif // #ifndef SPROUT_SUB_ARRAY_HPP diff --git a/user_config.hpp b/user_config.hpp new file mode 100644 index 00000000..c0a86f4e --- /dev/null +++ b/user_config.hpp @@ -0,0 +1,4 @@ + +//#define SPROUT_CONFIG_DISABLE_CONSTEXPR +//#define SPROUT_CONFIG_DISABLE_NOEXCEPT +//#define SPROUT_CONFIG_USE_SSCRISK_CEL