12#ifndef __AUDACITY_COMPOSITE__
13#define __AUDACITY_COMPOSITE__
35 typename ComponentPointer,
36 typename... ComponentArgs
42 using Items = std::vector<value_type>;
44 explicit Base(ComponentArgs... args)
47 static_assert(std::has_virtual_destructor_v<Component>);
64 [[nodiscard]]
bool empty()
const {
return items.empty(); }
78template<
typename Base,
typename Derived>
struct Traits {
79 static constexpr auto ItemBuilder = std::move<typename Base::value_type>;
84template<
bool Deprecate>
struct This;
85template<>
struct This<false> {};
86template<>
struct [[deprecated(
97template<
typename Base,
typename Derived,
typename... BaseArgs>
105 -> std::enable_if_t<Traits<Base, Derived>
106 ::template enables_item_type_v<Arg>,
117 ::template enables_item_type_v<typename Base::value_type>;
121 if constexpr(!enable) {
131 template<
typename...
Items>
139 template<
typename InputIterator,
140 typename Arg =
decltype(*std::declval<InputIterator>()),
142 typename sfinae = std::enable_if_t<std::is_invocable_v<ItemBuilder, Arg>>>
146 [](Arg &&arg) -> decltype(auto) {
return std::forward<Arg>(arg); }
151 template<
typename InputIterator,
typename Transformer,
152 typename Arg =
decltype(*std::declval<InputIterator>()),
154 typename sfinae = std::enable_if_t<std::is_invocable_v<
155 ItemBuilder, std::invoke_result_t<Transformer, Arg>>>>
157 InputIterator
begin, InputIterator
end, Transformer transformer
160 [
this, &transformer](Arg &&arg){ push_back(transformer(arg)); });
164 using BaseType::push_back;
171 typename... RequiredBaseArgs
177 template<
typename... OtherBaseArgs>
179 OtherBaseArgs &&...otherArgs
183 , Base2{
std::move(arg2) }
190 typename... RequiredBaseArgs
198 template<
typename... OtherBaseArgs>
199 Extension(RequiredBaseArgs... args, OtherBaseArgs &&...otherArgs)
Base(ComponentArgs... args)
ComponentPointer value_type
Base & operator=(const Base &)=delete
void push_back(value_type ptr)
std::vector< value_type > Items
Base(const Base &)=delete
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
auto begin(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
Builder(BaseArgs... args, InputIterator begin, InputIterator end, Transformer transformer)
Iterator range constructor, with explicit transformer.
Builder(BaseArgs... args, Items &&... items)
Variadic constructor.
Builder(BaseArgs... args, InputIterator begin, InputIterator end)
Iterator range constructor, with default transformer.
void push_back(typename Base::value_type arg)
auto push_back(Arg &&arg) -> std::enable_if_t< Traits< Base, Derived > ::template enables_item_type_v< Arg >, void >
Extension(RequiredBaseArgs... args, OtherBaseArgs &&...otherArgs)
Extend Base with extra fields, in a second, protected base class.
Extension(RequiredBaseArgs... args, Base2 arg2, OtherBaseArgs &&...otherArgs)
static constexpr auto ItemBuilder
static constexpr auto enables_item_type_v