1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
/**********************************************************************
Audacity: A Digital Audio Editor
@file NumericConverterRegistry.cpp
Dmitry Vedenko
**********************************************************************/
#include "NumericConverterRegistry.h"
namespace
{
const auto PathStart = L"NumericConverterRegistry";
}
NumericConverterRegistryItem::NumericConverterRegistryItem(
const Identifier& internalName, const NumericFormatSymbol& _symbol,
NumericConverterFormatterFactoryPtr _factory)
: SingleItem { internalName }
, symbol { _symbol }
, factory { std::move(_factory) }
{
}
NumericConverterRegistryItem::NumericConverterRegistryItem(
const Identifier& internalName, const NumericFormatSymbol& _symbol,
const TranslatableString& _fractionLabel,
NumericConverterFormatterFactoryPtr _factory)
: SingleItem { internalName }
, symbol { _symbol }
, fractionLabel { _fractionLabel }
, factory { std::move(_factory) }
{
}
NumericConverterRegistryItem::~NumericConverterRegistryItem()
{
}
Registry::GroupItem<NumericConverterRegistryTraits>&
NumericConverterRegistry::Registry()
{
static Registry::GroupItem<NumericConverterRegistryTraits>
registry { PathStart };
return registry;
}
void NumericConverterRegistry::Visit(
const FormatterContext& context, const NumericConverterType& type,
Visitor visitor)
{
static Registry::OrderingPreferenceInitializer init {
PathStart,
{ { L"", L"parsedTime,beats,parsedFrequency,parsedBandwith" } },
};
Registry::GroupItem<NumericConverterRegistryTraits> top { PathStart };
bool inMatchingGroup = false;
Registry::Visit(std::tuple{
[&](const NumericConverterRegistryGroup &group, auto&) {
inMatchingGroup = group.GetType() == type; },
[&](const NumericConverterRegistryItem &item, auto&) {
if (!inMatchingGroup)
return;
// Skip the items that are not acceptable in this context
if (!item.factory->IsAcceptableInContext(context))
return;
visitor(item);
},
[&](const NumericConverterRegistryGroup &, auto&) {
inMatchingGroup = false; }
}, &top, &Registry());
}
const NumericConverterRegistryItem* NumericConverterRegistry::Find(
const FormatterContext& context,
const NumericConverterType& type, const NumericFormatID& symbol)
{
const NumericConverterRegistryItem* result = nullptr;
Visit(
context,
type,
[&result, symbol](const NumericConverterRegistryItem& item)
{
if (item.symbol.Internal() == symbol)
result = &item;
});
return result;
}
NumericConverterRegistryGroup::~NumericConverterRegistryGroup()
{
}
|