Removed the 32 type limit for visitor and operator visits

Deleted variant_select_do_operator and variant_select_do_visitor headers
This commit is contained in:
John Wellbelove 2026-10-09 20:37:23 +01:00
parent edad83299e
commit ecdf1b3db8
6 changed files with 145 additions and 6725 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -381,11 +381,6 @@ namespace etl
template <typename T, typename... VTypes>
ETL_CONSTEXPR14 const T&& get(const etl::variant<VTypes...>&& v);
#if ETL_NOT_USING_CPP17
#include "variant_select_do_operator.h"
#include "variant_select_do_visitor.h"
#endif
constexpr bool operator>(etl::monostate, etl::monostate) ETL_NOEXCEPT
{
return false;
@ -1573,25 +1568,6 @@ namespace etl
{
(attempt_visitor<I>(visitor) || ...);
}
#else
//***************************************************************************
/// Call the relevant visitor.
//***************************************************************************
template <size_t NTypes, typename TVisitor>
void do_visitor(TVisitor& visitor)
{
etl::private_variant::select_do_visitor<NTypes>::do_visitor(*this, visitor);
}
//***************************************************************************
/// Call the relevant visitor.
//***************************************************************************
template <size_t NTypes, typename TVisitor>
void do_visitor(TVisitor& visitor) const
{
etl::private_variant::select_do_visitor<NTypes>::do_visitor(*this, visitor);
}
#endif
//***************************************************************************
/// Attempt to call a visitor.
@ -1635,6 +1611,74 @@ namespace etl
}
}
#else
//***************************************************************************
/// Call the relevant visitor.
//***************************************************************************
template <size_t NTypes, typename TVisitor>
void do_visitor(TVisitor& visitor)
{
do_visitor_at(visitor, etl::make_index_sequence<NTypes>{});
}
//***************************************************************************
/// Call the relevant visitor.
//***************************************************************************
template <size_t NTypes, typename TVisitor>
void do_visitor(TVisitor& visitor) const
{
do_visitor_at(visitor, etl::make_index_sequence<NTypes>{});
}
//***************************************************************************
/// Base case: exactly one index remains, so it's assumed to be the match.
//***************************************************************************
template <typename TVisitor, size_t Index>
void do_visitor_at(TVisitor& visitor, etl::index_sequence<Index>)
{
visitor.visit(etl::get<Index>(*this));
}
template <typename TVisitor, size_t Index>
void do_visitor_at(TVisitor& visitor, etl::index_sequence<Index>) const
{
visitor.visit(etl::get<Index>(*this));
}
//***************************************************************************
/// Recursive case: check Index against this->index(), otherwise defer.
//***************************************************************************
template <typename TVisitor, size_t Index, size_t Index2, size_t... Rest>
void do_visitor_at(TVisitor& visitor, etl::index_sequence<Index, Index2, Rest...>)
{
if (this->index() == Index)
{
visitor.visit(etl::get<Index>(*this));
}
else
{
do_visitor_at(visitor, etl::index_sequence<Index2, Rest...>{});
}
}
//***************************************************************************
/// Recursive case: check Index against this->index(), otherwise defer.
//***************************************************************************
template <typename TVisitor, size_t Index, size_t Index2, size_t... Rest>
void do_visitor_at(TVisitor& visitor, etl::index_sequence<Index, Index2, Rest...>) const
{
if (this->index() == Index)
{
visitor.visit(etl::get<Index>(*this));
}
else
{
do_visitor_at(visitor, etl::index_sequence<Index2, Rest...>{});
}
}
#endif
#if ETL_USING_CPP17 && !defined(ETL_VARIANT_FORCE_CPP11)
//***************************************************************************
/// Call the relevant visitor by attempting each one.
@ -1653,53 +1697,6 @@ namespace etl
{
(attempt_operator<I>(visitor) || ...);
}
#else
//***************************************************************************
/// Call the relevant operator.
//***************************************************************************
template <size_t NTypes, typename TVisitor>
void do_operator(TVisitor& visitor)
{
#if defined(ETL_VARIANT_CPP11_MAX_8_TYPES)
ETL_STATIC_ASSERT(sizeof...(TTypes) <= 8U, "ETL_VARIANT_CPP11_MAX_8_TYPES - Only a maximum of 8 types are allowed in this variant");
#endif
#if defined(ETL_VARIANT_CPP11_MAX_16_TYPES)
ETL_STATIC_ASSERT(sizeof...(TTypes) <= 16U, "ETL_VARIANT_CPP11_MAX_16_TYPES - Only a maximum of 16 types are allowed in this variant");
#endif
#if defined(ETL_VARIANT_CPP11_MAX_24_TYPES)
ETL_STATIC_ASSERT(sizeof...(TTypes) <= 24U, "ETL_VARIANT_CPP11_MAX_24_TYPES - Only a maximum of 24 types are allowed in this variant");
#endif
ETL_STATIC_ASSERT(sizeof...(TTypes) <= 32U, "A maximum of 32 types are allowed in this variant");
etl::private_variant::select_do_operator<NTypes>::do_operator(*this, visitor);
}
//***************************************************************************
/// Call the relevant operator.
//***************************************************************************
template <size_t NTypes, typename TVisitor>
void do_operator(TVisitor& visitor) const
{
#if defined(ETL_VARIANT_CPP11_MAX_8_TYPES)
ETL_STATIC_ASSERT(sizeof...(TTypes) <= 8U, "ETL_VARIANT_CPP11_MAX_8_TYPES - Only a maximum of 8 types are allowed in this variant");
#endif
#if defined(ETL_VARIANT_CPP11_MAX_16_TYPES)
ETL_STATIC_ASSERT(sizeof...(TTypes) <= 16U, "ETL_VARIANT_CPP11_MAX_16_TYPES - Only a maximum of 16 types are allowed in this variant");
#endif
#if defined(ETL_VARIANT_CPP11_MAX_24_TYPES)
ETL_STATIC_ASSERT(sizeof...(TTypes) <= 24U, "ETL_VARIANT_CPP11_MAX_24_TYPES - Only a maximum of 24 types are allowed in this variant");
#endif
ETL_STATIC_ASSERT(sizeof...(TTypes) <= 32U, "A maximum of 32 types are allowed in this variant");
etl::private_variant::select_do_operator<NTypes>::do_operator(*this, visitor);
}
#endif
//***************************************************************************
/// Attempt to call a visitor.
@ -1737,6 +1734,74 @@ namespace etl
}
}
#else
//***************************************************************************
/// Call the relevant visitor.
//***************************************************************************
template <size_t NTypes, typename TVisitor>
void do_operator(TVisitor& visitor)
{
do_operator_at(visitor, etl::make_index_sequence<NTypes>{});
}
//***************************************************************************
/// Call the relevant visitor.
//***************************************************************************
template <size_t NTypes, typename TVisitor>
void do_operator(TVisitor& visitor) const
{
do_operator_at(visitor, etl::make_index_sequence<NTypes>{});
}
//***************************************************************************
/// Base case: exactly one index remains, so it's assumed to be the match.
//***************************************************************************
template <typename TVisitor, size_t Index>
void do_operator_at(TVisitor& visitor, etl::index_sequence<Index>)
{
visitor(etl::get<Index>(*this));
}
template <typename TVisitor, size_t Index>
void do_operator_at(TVisitor& visitor, etl::index_sequence<Index>) const
{
visitor(etl::get<Index>(*this));
}
//***************************************************************************
/// Recursive case: check Index against this->index(), otherwise defer.
//***************************************************************************
template <typename TVisitor, size_t Index, size_t Index2, size_t... Rest>
void do_operator_at(TVisitor& visitor, etl::index_sequence<Index, Index2, Rest...>)
{
if (this->index() == Index)
{
visitor(etl::get<Index>(*this));
}
else
{
do_operator_at(visitor, etl::index_sequence<Index2, Rest...>{});
}
}
//***************************************************************************
/// Recursive case: check Index against this->index(), otherwise defer.
//***************************************************************************
template <typename TVisitor, size_t Index, size_t Index2, size_t... Rest>
void do_operator_at(TVisitor& visitor, etl::index_sequence<Index, Index2, Rest...>) const
{
if (this->index() == Index)
{
visitor(etl::get<Index>(*this));
}
else
{
do_operator_at(visitor, etl::index_sequence<Index2, Rest...>{});
}
}
#endif
//***************************************************************************
/// Get a reference to the stored value by index.
/// For trivially destructible types, accesses the variadic_union directly.
@ -2206,7 +2271,7 @@ namespace etl
static ETL_CONSTEXPR14 TReturn do_visit_at(TCallable&& f, TVariant&& v, index_sequence<tIndex>, TVarRest&&... variants)
{
return do_visit_single<TReturn, TCallable, TVariant, tIndex, TVarRest...>(static_cast<TCallable&&>(f), static_cast<TVariant&&>(v),
static_cast<TVarRest&&>(variants)...);
static_cast<TVarRest&&>(variants)...);
}
//***************************************************************************
@ -2219,12 +2284,12 @@ namespace etl
if (v.index() == tIndex)
{
return do_visit_single<TReturn, TCallable, TVariant, tIndex, TVarRest...>(static_cast<TCallable&&>(f), static_cast<TVariant&&>(v),
static_cast<TVarRest&&>(variants)...);
static_cast<TVarRest&&>(variants)...);
}
else
{
return do_visit_at<TReturn, TCallable, TVariant>(static_cast<TCallable&&>(f), static_cast<TVariant&&>(v), index_sequence<tIndex2, tRest...>{},
static_cast<TVarRest&&>(variants)...);
static_cast<TVarRest&&>(variants)...);
}
}
@ -2237,18 +2302,17 @@ namespace etl
ETL_ASSERT(!v.valueless_by_exception(), ETL_ERROR(bad_variant_access));
return do_visit_at<TReturn, TCallable, TVariant>(static_cast<TCallable&&>(f), static_cast<TVariant&&>(v), seq,
static_cast<TVarRest&&>(variants)...);
static_cast<TVarRest&&>(variants)...);
}
//***************************************************************************
///
//***************************************************************************
template <typename TReturn, typename TCallable, typename TVariant, typename... TVarRest>
static ETL_CONSTEXPR14 TReturn visit(TCallable&& f, TVariant&& v, TVarRest&&... vs)
template <typename TReturn, typename TCallable, typename TVariant, typename... TVs>
static ETL_CONSTEXPR14 TReturn visit(TCallable&& f, TVariant&& v, TVs&&... vs)
{
constexpr size_t variants = etl::variant_size<typename remove_reference<TVariant>::type>::value;
return do_visit<TReturn>(static_cast<TCallable&&>(f), static_cast<TVariant&&>(v), make_index_sequence<variants>{},
static_cast<TVarRest&&>(vs)...);
return do_visit<TReturn>(static_cast<TCallable&&>(f), static_cast<TVariant&&>(v), make_index_sequence<variants>{}, static_cast<TVs&&>(vs)...);
}
//***************************************************************************

View File

@ -12,377 +12,7 @@ project(etl_unit_tests LANGUAGES CXX)
add_executable(etl_tests
main.cpp
murmurhash3.cpp
test_algorithm.cpp
test_algorithm_ranges.cpp
test_alignment.cpp
test_array.cpp
test_array_view.cpp
test_array_wrapper.cpp
test_atomic.cpp
test_base64_RFC2152_decoder.cpp
test_base64_RFC2152_encoder.cpp
test_base64_RFC3501_decoder.cpp
test_base64_RFC3501_encoder.cpp
test_base64_RFC4648_decoder_with_no_padding.cpp
test_base64_RFC4648_decoder_with_padding.cpp
test_base64_RFC4648_encoder_with_no_padding.cpp
test_base64_RFC4648_encoder_with_padding.cpp
test_base64_RFC4648_URL_decoder_with_no_padding.cpp
test_base64_RFC4648_URL_decoder_with_padding.cpp
test_base64_RFC4648_URL_encoder_with_no_padding.cpp
test_base64_RFC4648_URL_encoder_with_padding.cpp
test_binary.cpp
test_bip_buffer_spsc_atomic.cpp
test_bit.cpp
test_bitset_legacy.cpp
test_bitset_new_comparisons.cpp
test_bitset_new_default_element_type.cpp
test_bitset_new_explicit_single_element_type.cpp
test_bitset_new_ext_default_element_type.cpp
test_bitset_new_ext_explicit_single_element_type.cpp
test_bit_stream.cpp
test_bit_stream_reader_big_endian.cpp
test_bit_stream_reader_little_endian.cpp
test_bit_stream_writer_big_endian.cpp
test_bit_stream_writer_little_endian.cpp
test_bloom_filter.cpp
test_bresenham_line.cpp
test_bsd_checksum.cpp
test_buffer_descriptors.cpp
test_byte.cpp
test_byte_stream.cpp
test_callback_service.cpp
test_callback_timer.cpp
test_callback_timer_atomic.cpp
test_callback_timer_deferred_locked.cpp
test_callback_timer_interrupt.cpp
test_callback_timer_locked.cpp
test_char_traits.cpp
test_checksum.cpp
test_chrono_clocks.cpp
test_chrono_day.cpp
test_chrono_duration.cpp
test_chrono_hh_mm_ss.cpp
test_chrono_literals.cpp
test_chrono_month.cpp
test_chrono_month_day.cpp
test_chrono_month_day_last.cpp
test_chrono_month_weekday.cpp
test_chrono_month_weekday_last.cpp
test_chrono_operators.cpp
test_chrono_time_point.cpp
test_chrono_weekday.cpp
test_chrono_weekday_indexed.cpp
test_chrono_weekday_last.cpp
test_chrono_year.cpp
test_chrono_year_month.cpp
test_chrono_year_month_day.cpp
test_chrono_year_month_day_last.cpp
test_chrono_year_month_weekday.cpp
test_chrono_year_month_weekday_last.cpp
test_circular_buffer.cpp
test_circular_buffer_external_buffer.cpp
test_circular_iterator.cpp
test_closure_with_default_delegate.cpp
test_closure_with_default_delegate_constexpr.cpp
test_closure_with_inplace_function.cpp
test_compare.cpp
test_concepts.cpp
test_constant.cpp
test_const_map.cpp
test_const_map_constexpr.cpp
test_const_map_ext.cpp
test_const_map_ext_constexpr.cpp
test_const_multimap.cpp
test_const_multimap_constexpr.cpp
test_const_multimap_ext.cpp
test_const_multimap_ext_constexpr.cpp
test_const_multiset.cpp
test_const_multiset_constexpr.cpp
test_const_multiset_ext.cpp
test_const_multiset_ext_constexpr.cpp
test_const_set.cpp
test_const_set_constexpr.cpp
test_const_set_ext.cpp
test_const_set_ext_constexpr.cpp
test_container.cpp
test_correlation.cpp
test_covariance.cpp
test_crc1.cpp
test_crc16.cpp
test_crc16_a.cpp
test_crc16_arc.cpp
test_crc16_aug_ccitt.cpp
test_crc16_buypass.cpp
test_crc16_ccitt.cpp
test_crc16_cdma2000.cpp
test_crc16_dds110.cpp
test_crc16_dectr.cpp
test_crc16_dectx.cpp
test_crc16_dnp.cpp
test_crc16_en13757.cpp
test_crc16_genibus.cpp
test_crc16_kermit.cpp
test_crc16_m17.cpp
test_crc16_maxim.cpp
test_crc16_mcrf4xx.cpp
test_crc16_modbus.cpp
test_crc16_opensafety_a.cpp
test_crc16_opensafety_b.cpp
test_crc16_profibus.cpp
test_crc16_riello.cpp
test_crc16_t10dif.cpp
test_crc16_teledisk.cpp
test_crc16_tms37157.cpp
test_crc16_usb.cpp
test_crc16_x25.cpp
test_crc16_xmodem.cpp
test_crc32.cpp
test_crc32_bzip2.cpp
test_crc32_c.cpp
test_crc32_d.cpp
test_crc32_jamcrc.cpp
test_crc32_mpeg2.cpp
test_crc32_posix.cpp
test_crc32_q.cpp
test_crc32_xfer.cpp
test_crc64_ecma.cpp
test_crc64_iso.cpp
test_crc8_ccitt.cpp
test_crc8_cdma2000.cpp
test_crc8_darc.cpp
test_crc8_dvbs2.cpp
test_crc8_ebu.cpp
test_crc8_icode.cpp
test_crc8_itu.cpp
test_crc8_j1850.cpp
test_crc8_j1850_zero.cpp
test_crc8_maxim.cpp
test_crc8_nrsc5.cpp
test_crc8_opensafety.cpp
test_crc8_rohc.cpp
test_crc8_wcdma.cpp
test_clamped_value.cpp
test_cyclic_value.cpp
test_debounce.cpp
test_delegate.cpp
test_delegate_cpp03.cpp
test_delegate_observable.cpp
test_delegate_service.cpp
test_delegate_service_compile_time.cpp
test_delegate_service_cpp03.cpp
test_deque.cpp
test_endian.cpp
test_enum_type.cpp
test_error_handler.cpp
test_etl_assert.cpp
test_etl_traits.cpp
test_exception.cpp
test_expected.cpp
test_fixed_iterator.cpp
test_fixed_sized_memory_block_allocator.cpp
test_flags.cpp
test_flat_map.cpp
test_flat_multimap.cpp
test_flat_multiset.cpp
test_flat_set.cpp
test_fnv_1.cpp
test_format.cpp
test_format_spec.cpp
test_forward_list.cpp
test_forward_list_shared_pool.cpp
test_fsm.cpp
test_function.cpp
test_functional.cpp
test_function_traits.cpp
test_gamma.cpp
test_hash.cpp
test_hfsm.cpp
test_hfsm_recurse_to_inner_state_on_start.cpp
test_hfsm_transition_on_enter.cpp
test_histogram.cpp
test_index_of_type.cpp
test_indirect_vector.cpp
test_indirect_vector_external_buffer.cpp
test_inplace_function.cpp
test_instance_count.cpp
test_integral_limits.cpp
test_intrusive_avl_tree.cpp
test_intrusive_forward_list.cpp
test_intrusive_links.cpp
test_intrusive_list.cpp
test_intrusive_queue.cpp
test_intrusive_stack.cpp
test_invert.cpp
test_invoke.cpp
test_io_port.cpp
test_is_invocable.cpp
test_iterator.cpp
test_jenkins.cpp
test_largest.cpp
test_limiter.cpp
test_limits.cpp
test_list.cpp
test_list_shared_pool.cpp
test_macros.cpp
test_make_string.cpp
test_manchester.cpp
test_map.cpp
test_math.cpp
test_math_functions.cpp
test_mean.cpp
test_memory.cpp
test_mem_cast.cpp
test_mem_cast_ptr.cpp
test_message.cpp
test_message_broker.cpp
test_message_bus.cpp
test_message_packet.cpp
test_message_router.cpp
test_message_router_registry.cpp
test_message_timer.cpp
test_message_timer_atomic.cpp
test_message_timer_interrupt.cpp
test_message_timer_locked.cpp
test_multimap.cpp
test_multiset.cpp
test_multi_array.cpp
test_multi_range.cpp
test_multi_span.cpp
test_multi_vector.cpp
test_murmur3.cpp
test_not_null_pointer.cpp
test_not_null_pointer_constexpr.cpp
test_not_null_unique_pointer.cpp
test_nth_type.cpp
test_numeric.cpp
test_observer.cpp
test_optional.cpp
test_overload.cpp
test_packet.cpp
test_parameter_pack.cpp
test_parameter_type.cpp
test_parity_checksum.cpp
test_pearson.cpp
test_poly_span_dynamic_extent.cpp
test_poly_span_fixed_extent.cpp
test_pool.cpp
test_pool_external_buffer.cpp
test_priority_queue.cpp
test_print.cpp
test_pseudo_moving_average.cpp
test_quantize.cpp
test_queue.cpp
test_queue_lockable.cpp
test_queue_lockable_small.cpp
test_queue_memory_model_small.cpp
test_queue_mpmc_mutex.cpp
test_queue_mpmc_mutex_small.cpp
test_queue_spsc_atomic.cpp
test_queue_spsc_atomic_small.cpp
test_queue_spsc_isr.cpp
test_queue_spsc_isr_small.cpp
test_queue_spsc_locked.cpp
test_queue_spsc_locked_small.cpp
test_random.cpp
test_ranges.cpp
test_ratio.cpp
test_reference_flat_map.cpp
test_reference_flat_multimap.cpp
test_reference_flat_multiset.cpp
test_reference_flat_set.cpp
test_rescale.cpp
test_result.cpp
test_rms.cpp
test_rounded_integral_division.cpp
test_scaled_rounding.cpp
test_set.cpp
test_shared_message.cpp
test_signal.cpp
test_singleton.cpp
test_singleton_base.cpp
test_smallest.cpp
test_span_dynamic_extent.cpp
test_span_fixed_extent.cpp
test_stack.cpp
test_standard_deviation.cpp
test_state_chart.cpp
test_state_chart_compile_time.cpp
test_state_chart_compile_time_with_data_parameter.cpp
test_state_chart_with_data_parameter.cpp
test_state_chart_with_rvalue_data_parameter.cpp
test_string_char.cpp
test_string_char_external_buffer.cpp
test_string_stream.cpp
test_string_stream_u16.cpp
test_string_stream_u32.cpp
test_string_stream_u8.cpp
test_string_stream_wchar_t.cpp
test_string_u16.cpp
test_string_u16_external_buffer.cpp
test_string_u32.cpp
test_string_u32_external_buffer.cpp
test_string_u8.cpp
test_string_u8_external_buffer.cpp
test_string_utilities.cpp
test_string_utilities_std.cpp
test_string_utilities_std_u16.cpp
test_string_utilities_std_u32.cpp
test_string_utilities_std_u8.cpp
test_string_utilities_std_wchar_t.cpp
test_string_utilities_u16.cpp
test_string_utilities_u32.cpp
test_string_utilities_u8.cpp
test_string_utilities_wchar_t.cpp
test_string_view.cpp
test_string_wchar_t.cpp
test_string_wchar_t_external_buffer.cpp
test_successor.cpp
test_task_scheduler.cpp
test_threshold.cpp
test_to_arithmetic.cpp
test_to_arithmetic_u16.cpp
test_to_arithmetic_u32.cpp
test_to_arithmetic_u8.cpp
test_to_arithmetic_wchar_t.cpp
test_to_string.cpp
test_to_u16string.cpp
test_to_u32string.cpp
test_to_u8string.cpp
test_to_wstring.cpp
test_tuple.cpp
test_type_def.cpp
test_type_list.cpp
test_type_lookup.cpp
test_type_select.cpp
test_type_traits.cpp
test_unaligned_type.cpp
test_unaligned_type_ext.cpp
test_uncopyable.cpp
test_unordered_map.cpp
test_unordered_multimap.cpp
test_unordered_multiset.cpp
test_unordered_set.cpp
test_user_type.cpp
test_utility.cpp
test_variance.cpp
test_variant_legacy.cpp
test_variant_pool.cpp
test_variant_pool_external_buffer.cpp
test_variant_variadic.cpp
test_vector.cpp
test_vector_external_buffer.cpp
test_vector_non_trivial.cpp
test_vector_pointer.cpp
test_vector_pointer_external_buffer.cpp
test_vector_function_pointer.cpp
test_vector_function_pointer_external_buffer.cpp
test_vector_member_function_pointer.cpp
test_vector_member_function_pointer_external_buffer.cpp
test_visitor.cpp
test_xor_checksum.cpp
test_xor_rotate_checksum.cpp
)
target_compile_definitions(etl_tests PRIVATE -DETL_DEBUG)

View File

@ -3596,8 +3596,6 @@
<ClInclude Include="..\..\include\etl\private\diagnostic_unused_function_push.h" />
<ClInclude Include="..\..\include\etl\private\tuple_element.h" />
<ClInclude Include="..\..\include\etl\private\tuple_size.h" />
<ClInclude Include="..\..\include\etl\private\variant_select_do_operator.h" />
<ClInclude Include="..\..\include\etl\private\variant_select_do_visitor.h" />
<ClInclude Include="..\..\include\etl\pseudo_moving_average.h" />
<ClInclude Include="..\..\include\etl\delegate.h" />
<ClInclude Include="..\..\include\etl\delegate_service.h" />
@ -11807,4 +11805,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View File

@ -1407,12 +1407,6 @@
<ClInclude Include="..\..\include\etl\index_of_type.h">
<Filter>ETL\Utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\private\variant_select_do_visitor.h">
<Filter>ETL\Private</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\private\variant_select_do_operator.h">
<Filter>ETL\Private</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\monostate.h">
<Filter>ETL\Utilities</Filter>
</ClInclude>
@ -4124,4 +4118,4 @@
<Filter>Resource Files\Images</Filter>
</Image>
</ItemGroup>
</Project>
</Project>