Advanced Chunk Processing Library 0.2.0
A comprehensive C++ library for advanced data chunking strategies and processing operations
Loading...
Searching...
No Matches
chunk_processing::RecursiveSubChunkStrategy< T > Class Template Reference

#include <sub_chunk_strategies.hpp>

+ Inheritance diagram for chunk_processing::RecursiveSubChunkStrategy< T >:
+ Collaboration diagram for chunk_processing::RecursiveSubChunkStrategy< T >:

Public Member Functions

 RecursiveSubChunkStrategy (std::shared_ptr< ChunkStrategy< T > > strategy, size_t max_depth=5, size_t min_size=2)
 
std::vector< std::vector< T > > apply (const std::vector< T > &data) const override
 

Private Member Functions

std::vector< std::vector< T > > safe_recursive_apply (const std::vector< T > &data, const size_t current_depth)
 

Private Attributes

const std::shared_ptr< ChunkStrategy< T > > base_strategy_
 
std::atomic< bool > is_processing_ {false}
 
const size_t max_depth_
 
const size_t min_size_
 
std::mutex mutex_
 

Detailed Description

template<typename T>
class chunk_processing::RecursiveSubChunkStrategy< T >

Definition at line 47 of file sub_chunk_strategies.hpp.

Constructor & Destructor Documentation

◆ RecursiveSubChunkStrategy()

template<typename T >
chunk_processing::RecursiveSubChunkStrategy< T >::RecursiveSubChunkStrategy ( std::shared_ptr< ChunkStrategy< T > >  strategy,
size_t  max_depth = 5,
size_t  min_size = 2 
)
inline

Definition at line 113 of file sub_chunk_strategies.hpp.

115 : base_strategy_(strategy), max_depth_(max_depth), min_size_(min_size) {
116 if (!strategy)
117 throw std::invalid_argument("Invalid strategy");
118 if (max_depth == 0)
119 throw std::invalid_argument("Invalid max depth");
120 if (min_size == 0)
121 throw std::invalid_argument("Invalid min size");
122 }
const std::shared_ptr< ChunkStrategy< T > > base_strategy_

Member Function Documentation

◆ apply()

template<typename T >
std::vector< std::vector< T > > chunk_processing::RecursiveSubChunkStrategy< T >::apply ( const std::vector< T > &  data) const
inlineoverridevirtual

Implements chunk_processing::ChunkStrategy< T >.

Definition at line 124 of file sub_chunk_strategies.hpp.

124 {
125 try {
126 if (data.empty())
127 return {};
128 return const_cast<RecursiveSubChunkStrategy*>(this)->safe_recursive_apply(data, 0);
129 } catch (...) {
130 return {data};
131 }
132 }
RecursiveSubChunkStrategy(std::shared_ptr< ChunkStrategy< T > > strategy, size_t max_depth=5, size_t min_size=2)
std::vector< std::vector< T > > safe_recursive_apply(const std::vector< T > &data, const size_t current_depth)

References chunk_processing::RecursiveSubChunkStrategy< T >::safe_recursive_apply().

Referenced by TEST_F(), and TEST_F().

◆ safe_recursive_apply()

template<typename T >
std::vector< std::vector< T > > chunk_processing::RecursiveSubChunkStrategy< T >::safe_recursive_apply ( const std::vector< T > &  data,
const size_t  current_depth 
)
inlineprivate

Definition at line 55 of file sub_chunk_strategies.hpp.

56 {
57 // Guard against reentrant calls
58 if (is_processing_.exchange(true)) {
59 throw std::runtime_error("Recursive strategy already processing");
60 }
61 struct Guard {
62 std::atomic<bool>& flag;
63 Guard(std::atomic<bool>& f) : flag(f) {}
64 ~Guard() {
65 flag = false;
66 }
67 } guard(is_processing_);
68
69 try {
70 if (data.empty() || current_depth >= max_depth_ || data.size() <= min_size_) {
71 return data.empty() ? std::vector<std::vector<T>>{}
72 : std::vector<std::vector<T>>{data};
73 }
74
75 std::vector<std::vector<T>> result;
76 {
77 std::lock_guard<std::mutex> lock(mutex_);
78 if (!base_strategy_) {
79 throw std::runtime_error("Invalid base strategy");
80 }
81 auto chunks = detail::safe_copy(base_strategy_->apply(data));
82 if (!detail::is_valid_chunks(chunks)) {
83 return {data};
84 }
85 result.reserve(chunks.size() * 2);
86
87 for (const auto& chunk : chunks) {
88 if (chunk.size() <= min_size_) {
89 result.push_back(chunk);
90 continue;
91 }
92
93 try {
94 auto sub_chunks = safe_recursive_apply(chunk, current_depth + 1);
95 if (detail::is_valid_chunks(sub_chunks)) {
96 result.insert(result.end(), std::make_move_iterator(sub_chunks.begin()),
97 std::make_move_iterator(sub_chunks.end()));
98 } else {
99 result.push_back(chunk);
100 }
101 } catch (...) {
102 result.push_back(chunk);
103 }
104 }
105 }
106 return result.empty() ? std::vector<std::vector<T>>{data} : result;
107 } catch (...) {
108 return {data};
109 }
110 }
bool is_valid_chunks(const std::vector< std::vector< T > > &chunks)
std::vector< std::vector< T > > safe_copy(const std::vector< std::vector< T > > &chunks)

References chunk_processing::RecursiveSubChunkStrategy< T >::base_strategy_, chunk_processing::RecursiveSubChunkStrategy< T >::is_processing_, chunk_processing::detail::is_valid_chunks(), chunk_processing::RecursiveSubChunkStrategy< T >::max_depth_, chunk_processing::RecursiveSubChunkStrategy< T >::min_size_, chunk_processing::RecursiveSubChunkStrategy< T >::mutex_, chunk_processing::detail::safe_copy(), and chunk_processing::RecursiveSubChunkStrategy< T >::safe_recursive_apply().

Referenced by chunk_processing::RecursiveSubChunkStrategy< T >::apply(), and chunk_processing::RecursiveSubChunkStrategy< T >::safe_recursive_apply().

Member Data Documentation

◆ base_strategy_

template<typename T >
const std::shared_ptr<ChunkStrategy<T> > chunk_processing::RecursiveSubChunkStrategy< T >::base_strategy_
private

◆ is_processing_

template<typename T >
std::atomic<bool> chunk_processing::RecursiveSubChunkStrategy< T >::is_processing_ {false}
private

◆ max_depth_

template<typename T >
const size_t chunk_processing::RecursiveSubChunkStrategy< T >::max_depth_
private

◆ min_size_

template<typename T >
const size_t chunk_processing::RecursiveSubChunkStrategy< T >::min_size_
private

◆ mutex_

template<typename T >
std::mutex chunk_processing::RecursiveSubChunkStrategy< T >::mutex_
mutableprivate

The documentation for this class was generated from the following file: