Audacity 3.2.0
Classes | Macros | Typedefs | Functions
MemoryX.h File Reference
#include <iterator>
#include <memory>
#include <new>
#include <cstdlib>
#include <functional>
#include <limits>
#include <algorithm>
#include <type_traits>
#include <variant>
#include <stdexcept>
Include dependency graph for MemoryX.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  ArrayOf< X >
 Memory.h template class for making an array of float, bool, etc. More...
 
class  ArraysOf< X >
 memory.h template class for making an array of arrays. More...
 
struct  freer
 
struct  Destroyer< T >
 A deleter class to supply the second template parameter of unique_ptr for classes like wxWindow that should be sent a message called Destroy rather than be deleted directly. More...
 
struct  Final_action< F >
 "finally" as in The C++ Programming Language, 4th ed., p. 358 Useful for defining ad-hoc RAII actions. typical usage: auto cleanup = finally([&]{ ... code; ... }); More...
 
struct  RestoreValue< T >
 Structure used by ValueRestorer. More...
 
class  ValueRestorer< T >
 Set a variable temporarily in a scope. More...
 
struct  ValueIterator< Value, Category >
 A convenience for defining iterators that return rvalue types, so that they cooperate correctly with stl algorithms and std::reverse_iterator. More...
 
struct  IteratorRange< Iterator >
 A convenience for use with range-for. More...
 
struct  IteratorRange< Iterator >::identity< T >
 
struct  NonInterfering< T >
 
struct  VisitHelperReturn< Visitor, Variant >
 Help to define Visit() below. More...
 

Macros

#define safenew   new
 
#define QUANTIZED_TIME(time, rate)   (floor(((double)(time) * (rate)) + 0.5) / (rate))
 
#define DB_TO_LINEAR(x)   (pow(10.0, (x) / 20.0))
 
#define LINEAR_TO_DB(x)   (20.0 * log10(x))
 
#define MAX_AUDIO   (1. - 1./(1<<15))
 

Typedefs

template<typename T >
using MallocPtr = std::unique_ptr< T, freer >
 
template<typename Character = char>
using MallocString = std::unique_ptr< Character[], freer >
 
template<typename T >
using Destroy_ptr = std::unique_ptr< T, Destroyer< T > >
 a convenience for using Destroyer More...
 

Functions

template<typename F >
Final_action< F > finally (F f)
 Function template with type deduction lets you construct Final_action without typing any angle brackets. More...
 
template<typename T >
ValueRestorer< T > valueRestorer (T &var)
 inline functions provide convenient parameter type deduction More...
 
template<typename T >
ValueRestorer< T > valueRestorer (T &var, const T &newValue)
 
template<typename Iterator >
IteratorRange< Iterator > make_iterator_range (const Iterator &i1, const Iterator &i2)
 
template<typename Container >
IteratorRange< typename Container::iterator > make_iterator_range (Container &container)
 
template<typename Container >
IteratorRange< typename Container::const_iterator > make_iterator_range (const Container &container)
 
template<typename Container , typename Iterator , typename Function >
Container transform_range (Iterator first, Iterator last, Function &&fn)
 
template<typename OutContainer , typename InContainer , typename Function >
OutContainer transform_container (InContainer &inContainer, Function &&fn)
 
struct UTILITY_API alignas (64) NonInterferingBase
 Non-template helper for class template NonInterfering. More...
 
template<typename Visitor , typename Variant >
auto VisitHelper (Visitor &&, Variant &&) -> typename VisitHelperReturn< Visitor, Variant >::type
 Help to define Visit() below. More...
 
template<size_t Index, size_t... Indices, typename Visitor , typename Variant >
auto VisitHelper (Visitor &&vis, Variant &&var)
 Help to define Visit() below. More...
 
template<size_t... Indices, typename Visitor , typename Variant >
auto VisitHelper (std::index_sequence< Indices... >, Visitor &&vis, Variant &&var)
 Help to define Visit() below. More...
 
template<typename Visitor , typename Variant >
auto Visit (Visitor &&vis, Variant &&var)
 Mimic some of std::visit, for the case of one visitor only. More...
 

Macro Definition Documentation

◆ DB_TO_LINEAR

#define DB_TO_LINEAR (   x)    (pow(10.0, (x) / 20.0))

Definition at line 502 of file MemoryX.h.

◆ LINEAR_TO_DB

#define LINEAR_TO_DB (   x)    (20.0 * log10(x))

Definition at line 503 of file MemoryX.h.

◆ MAX_AUDIO

#define MAX_AUDIO   (1. - 1./(1<<15))

Definition at line 505 of file MemoryX.h.

◆ QUANTIZED_TIME

#define QUANTIZED_TIME (   time,
  rate 
)    (floor(((double)(time) * (rate)) + 0.5) / (rate))

Definition at line 500 of file MemoryX.h.

◆ safenew

#define safenew   new

Definition at line 10 of file MemoryX.h.

Typedef Documentation

◆ Destroy_ptr

template<typename T >
using Destroy_ptr = std::unique_ptr<T, Destroyer<T> >

a convenience for using Destroyer

Definition at line 162 of file MemoryX.h.

◆ MallocPtr

template<typename T >
using MallocPtr = std::unique_ptr< T, freer >

A useful alias for holding the result of malloc

Definition at line 140 of file MemoryX.h.

◆ MallocString

template<typename Character = char>
using MallocString = std::unique_ptr< Character[], freer >

A useful alias for holding the result of strup and similar

Definition at line 146 of file MemoryX.h.

Function Documentation

◆ alignas()

struct UTILITY_API alignas ( 64  )

Non-template helper for class template NonInterfering.

If a structure contains any members with large alignment, this base class may also allow it to work in macOS builds under current limitations of the C++17 standard implementation.

Definition at line 463 of file MemoryX.h.

472 {
473 static void *operator new(std::size_t count, std::align_val_t al);
474 static void operator delete(void *ptr, std::align_val_t al);
475
476#if defined (_MSC_VER) && defined(_DEBUG)
477 // Versions that work in the presence of the DEBUG_NEW macro.
478 // Ignore the arguments supplied by the macro and forward to the
479 // other overloads.
480 static void *operator new(
481 std::size_t count, std::align_val_t al, int, const char *, int)
482 { return operator new(count, al); }
483 static void operator delete(
484 void *ptr, std::align_val_t al, int, const char *, int)
485 { return operator delete(ptr, al); }
486#endif
487};

◆ finally()

template<typename F >
Final_action< F > finally ( f)

Function template with type deduction lets you construct Final_action without typing any angle brackets.

Definition at line 182 of file MemoryX.h.

183{
184 return Final_action<F>(f);
185}
"finally" as in The C++ Programming Language, 4th ed., p. 358 Useful for defining ad-hoc RAII actions...
Definition: MemoryX.h:173

◆ make_iterator_range() [1/3]

template<typename Container >
IteratorRange< typename Container::const_iterator > make_iterator_range ( const Container &  container)

Definition at line 437 of file MemoryX.h.

438{
439 return { container.begin(), container.end() };
440}

◆ make_iterator_range() [2/3]

template<typename Iterator >
IteratorRange< Iterator > make_iterator_range ( const Iterator &  i1,
const Iterator &  i2 
)

◆ make_iterator_range() [3/3]

template<typename Container >
IteratorRange< typename Container::iterator > make_iterator_range ( Container &  container)

Definition at line 430 of file MemoryX.h.

431{
432 return { container.begin(), container.end() };
433}

◆ transform_container()

template<typename OutContainer , typename InContainer , typename Function >
OutContainer transform_container ( InContainer &  inContainer,
Function &&  fn 
)

Definition at line 452 of file MemoryX.h.

453{
454 return transform_range<OutContainer>(
455 inContainer.begin(), inContainer.end(), fn );
456}
static const auto fn

References fn.

◆ transform_range()

template<typename Container , typename Iterator , typename Function >
Container transform_range ( Iterator  first,
Iterator  last,
Function &&  fn 
)

Definition at line 444 of file MemoryX.h.

445{
446 Container result;
447 std::transform( first, last, std::back_inserter( result ), fn );
448 return result;
449}

References fn.

◆ valueRestorer() [1/2]

template<typename T >
ValueRestorer< T > valueRestorer ( T &  var)

inline functions provide convenient parameter type deduction

Definition at line 226 of file MemoryX.h.

227{ return ValueRestorer< T >{ var }; }
Set a variable temporarily in a scope.
Definition: MemoryX.h:204

Referenced by MacroCommands::ApplyMacro(), AudacityCommand::DoAudacityCommand(), EffectBase::DoEffect(), CommandManager::FilterKeyEvent(), Importer::Import(), EffectNoiseReduction::Dialog::OnPreview(), EffectAmplify::Preview(), EffectBase::Preview(), EffectTimeScale::Preview(), NyquistEffect::Process(), NyquistEffect::ProcessOne(), and AudacityCommand::ShowInterface().

Here is the caller graph for this function:

◆ valueRestorer() [2/2]

template<typename T >
ValueRestorer< T > valueRestorer ( T &  var,
const T &  newValue 
)

Definition at line 230 of file MemoryX.h.

231{ return ValueRestorer< T >{ var, newValue }; }

◆ Visit()

template<typename Visitor , typename Variant >
auto Visit ( Visitor &&  vis,
Variant &&  var 
)

Mimic some of std::visit, for the case of one visitor only.

This is necessary because of limitations of the macOS implementation of some of the C++17 standard library without a minimum version of 10.13, and so let's use this even when not needed on the other platforms, instead of having too much conditional compilation

Definition at line 570 of file MemoryX.h.

571{
572 constexpr auto size = std::variant_size_v<std::remove_reference_t<Variant>>;
573 return VisitHelper( std::make_index_sequence<size>{},
574 std::forward<Visitor>(vis), std::forward<Variant>(var) );
575}
auto VisitHelper(Visitor &&, Variant &&) -> typename VisitHelperReturn< Visitor, Variant >::type
Help to define Visit() below.
Definition: MemoryX.h:529

References size, and VisitHelper().

Referenced by EffectTruncSilence::DoRemoval(), Exporter::Exporter(), PluginManager::GetConfigValue(), Importer::Initialize(), ToolDock::LayoutToolBars(), EditActions::Handler::OnCut(), ToolDock::PositionBar(), and PluginManager::SetConfigValue().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ VisitHelper() [1/3]

template<size_t... Indices, typename Visitor , typename Variant >
auto VisitHelper ( std::index_sequence< Indices... >  ,
Visitor &&  vis,
Variant &&  var 
)

Help to define Visit() below.

Definition at line 556 of file MemoryX.h.

557{
558 // Non-template parameters were deduced and are passed on as non-deduced
559 return VisitHelper<Indices...>(
560 std::forward<Visitor>(vis), std::forward<Variant>(var) );
561}

References VisitHelper().

Here is the call graph for this function:

◆ VisitHelper() [2/3]

template<typename Visitor , typename Variant >
auto VisitHelper ( Visitor &&  ,
Variant &&   
) -> typename VisitHelperReturn<Visitor, Variant>::type

Help to define Visit() below.

Definition at line 529 of file MemoryX.h.

531{
532 // Fall through here when the variant holds no value
533 // Should really throw std::bad_variant_access but that may not be available
534 throw std::invalid_argument{"Bad variant"};
535}

Referenced by Visit(), and VisitHelper().

Here is the caller graph for this function:

◆ VisitHelper() [3/3]

template<size_t Index, size_t... Indices, typename Visitor , typename Variant >
auto VisitHelper ( Visitor &&  vis,
Variant &&  var 
)

Help to define Visit() below.

Definition at line 539 of file MemoryX.h.

540{
541 // Invoke vis at most once after no-throw testing for presence of
542 // alternatives in the variant
543 if (const auto pValue = std::get_if<Index>(&var)) {
544 if constexpr (std::is_lvalue_reference_v<Variant>)
545 return std::invoke( std::forward<Visitor>(vis), (*pValue) );
546 else
547 return std::invoke( std::forward<Visitor>(vis), std::move(*pValue) );
548 }
549 // Recur down the index value pack
550 return VisitHelper<Indices...>(
551 std::forward<Visitor>(vis), std::forward<Variant>(var));
552}

References VisitHelper().

Here is the call graph for this function: