MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
SortingHelper.cpp
Go to the documentation of this file.
1#include "SortingHelper.hpp"
2
3namespace MayaFlux::Yantra {
4
5void sort_span_inplace(std::span<double> data,
6 SortingDirection direction,
7 SortingAlgorithm algorithm)
8{
9 if (data.empty()) {
10 return;
11 }
12
13 auto comp = create_double_comparator(direction);
14 execute_sorting_algorithm(data.begin(), data.end(), comp, algorithm);
15}
16
17std::span<double> sort_span_extract(std::span<const double> data,
18 std::vector<double>& output_storage,
19 SortingDirection direction,
20 SortingAlgorithm algorithm)
21{
22 output_storage.assign(data.begin(), data.end());
23
24 std::span<double> output_span(output_storage.data(), output_storage.size());
25 sort_span_inplace(output_span, direction, algorithm);
26
27 return output_span;
28}
29
30void sort_channels_inplace(std::vector<std::span<double>>& channels,
31 SortingDirection direction,
32 SortingAlgorithm algorithm)
33{
34 for (auto& channel : channels) {
35 sort_span_inplace(channel, direction, algorithm);
36 }
37}
38
39std::vector<std::span<double>> sort_channels_extract(
40 const std::vector<std::span<const double>>& channels,
41 std::vector<std::vector<double>>& output_storage,
42 SortingDirection direction,
43 SortingAlgorithm algorithm)
44{
45 output_storage.resize(channels.size());
46
47 std::vector<std::span<double>> output_spans;
48 output_spans.reserve(channels.size());
49
50 for (size_t i = 0; i < channels.size(); ++i) {
51 auto output_span = sort_span_extract(channels[i], output_storage[i], direction, algorithm);
52 output_spans.push_back(output_span);
53 }
54
55 return output_spans;
56}
57
58std::vector<size_t> generate_span_sort_indices(std::span<double> data,
59 SortingDirection direction)
60{
61 std::vector<size_t> indices(data.size());
62 std::iota(indices.begin(), indices.end(), 0);
63
64 if (data.empty()) {
65 return indices;
66 }
67
68 auto comp = create_double_comparator(direction);
69 std::ranges::sort(indices, [&](size_t a, size_t b) {
70 return comp(data[a], data[b]);
71 });
72
73 return indices;
74}
75
76std::vector<std::vector<size_t>> generate_channels_sort_indices(
77 const std::vector<std::span<double>>& channels,
78 SortingDirection direction)
79{
80 std::vector<std::vector<size_t>> indices;
81 indices.reserve(channels.size());
82
83 for (const auto& channel : channels) {
84 indices.push_back(generate_span_sort_indices(channel, direction));
85 }
86
87 return indices;
88}
89
90} // namespace MayaFlux::Yantra
void execute_sorting_algorithm(Iterator begin, Iterator end, Comparator comp, SortingAlgorithm algorithm)
Execute sorting algorithm on iterator range.
std::vector< size_t > generate_span_sort_indices(std::span< double > data, SortingDirection direction)
Generate sort indices for a single span.
void sort_channels_inplace(std::vector< std::span< double > > &channels, SortingDirection direction, SortingAlgorithm algorithm)
Sort multiple channels (spans) in-place.
std::vector< std::vector< size_t > > generate_channels_sort_indices(const std::vector< std::span< double > > &channels, SortingDirection direction)
Generate sort indices for multiple channels.
void sort_span_inplace(std::span< double > data, SortingDirection direction, SortingAlgorithm algorithm)
Sort a single span of doubles in-place.
auto create_double_comparator(SortingDirection direction)
Create standard direction-based comparator for doubles.
SortingDirection
Basic sort direction for simple comparisons.
SortingAlgorithm
Available sorting algorithms for different use cases.
std::vector< std::span< double > > sort_channels_extract(const std::vector< std::span< const double > > &channels, std::vector< std::vector< double > > &output_storage, SortingDirection direction, SortingAlgorithm algorithm)
Sort multiple channels and return copies.
std::span< double > sort_span_extract(std::span< const double > data, std::vector< double > &output_storage, SortingDirection direction, SortingAlgorithm algorithm)
Sort a single span and return copy in output vector.