File: NumericConverterRegistry.cpp

package info (click to toggle)
audacity 3.7.3%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 125,252 kB
  • sloc: cpp: 358,238; ansic: 75,458; lisp: 7,761; sh: 3,410; python: 1,503; xml: 1,385; perl: 854; makefile: 122
file content (97 lines) | stat: -rw-r--r-- 2,801 bytes parent folder | download | duplicates (2)
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()
{
}