VISR  0.12.0
Versatile Interactive Scene Renderer
lagrange_coefficient_calculator.hpp
Go to the documentation of this file.
1 /* Copyright Institute of Sound and Vibration Research - All rights reserved */
2 
8 #ifndef VISR_LIBEFL_LAGRANGE_COEFFICIENT_CALCULATOR_HPP_INCLUDED
9 #define VISR_LIBEFL_LAGRANGE_COEFFICIENT_CALCULATOR_HPP_INCLUDED
10 
11 #include "export_symbols.hpp"
12 
13 #include <array>
14 
15 // #define LAGRANGE_COEFFICIENT_CALCULATOR_GENERATE_STAGE_TABLES
16 
17 namespace visr
18 {
19 namespace efl
20 {
21 
29 template< typename DataType, std::size_t N, bool reverseCoeffs = false >
30 class VISR_EFL_LIBRARY_SYMBOL LagrangeCoefficientCalculator
31 {
32 public:
37 
43  void calculateCoefficients( DataType mu, DataType * result ) const;
44 
45 private:
46  static constexpr std::size_t storageSize() { return internalStorageSize( N + 1 ); }
47 
48  static constexpr std::size_t internalStorageSize( size_t length )
49  {
50  return length <= 2 ? length : length + internalStorageSize( length / 2 );
51  }
52 
53  static constexpr std::size_t numberOfStages()
54  {
55  return numberOfStagesImpl( N+1 );
56  }
57 
58  static constexpr std::size_t stageSize( std::size_t stage )
59  {
60  return stage == 0 ? N+1 : stageSize( stage - 1 ) / 2;
61  }
62 
63  static constexpr std::size_t stageOffset( std::size_t stage )
64  {
65  return stage == 0 ? 0 : stageOffset( stage - 1 ) + stageSize( stage - 1 );
66  }
67 
68  template<std::size_t length>
69  void multiplyAndShuffle( DataType * coeffs ) const;
70 
71  static DataType offset( std::size_t idx );
72 
73  static DataType scaleFactor( std::size_t idx );
74 
75  static constexpr std::size_t numberOfStagesImpl( std::size_t length )
76  {
77  return length <= 1 ? 1 : 1 + numberOfStagesImpl( length / 2 );
78  }
79 
80  static std::array<DataType, N+1> generateOffsets();
81 
82  static std::array<DataType, N+1> generateScaleFactors();
83 
84 #if LAGRANGE_COEFFICIENT_CALCULATOR_GENERATE_STAGE_TABLES
85  static std::array<std::size_t, LagrangeCoefficientCalculator<DataType,N>::numberOfStages()> generateStageSizes();
86 
87  static std::array<std::size_t, LagrangeCoefficientCalculator<DataType,N>::numberOfStages()> generateStageOffsets();
88 #endif
89  mutable std::array<DataType, internalStorageSize(N+1)> mInternalCoeffs;
90 
91  const std::array<DataType, N+1> cOffsets;
92 
93  const std::array<DataType, N+1> cScaleFactors;
94 
95 #if LAGRANGE_COEFFICIENT_CALCULATOR_GENERATE_STAGE_TABLES
96  static const std::array<std::size_t, LagrangeCoefficientCalculator<DataType,N>::numberOfStages()> cStageSizes;
97 
98  static const std::array<std::size_t, LagrangeCoefficientCalculator<DataType,N>::numberOfStages()> cStageOffsets;
99 #endif
100 };
101 
102 } // namespace efl
103 } // namespace visr
104 
105 #endif // #ifndef VISR_LIBEFL_LAGRANGE_COEFFICIENT_CALCULATOR_HPP_INCLUDED
Definition: options.cpp:10
Definition: lagrange_coefficient_calculator.hpp:30