AAX SDK  2.4.1
Avid Audio Extensions Development Kit
AAX_CUnitPrefixDisplayDelegateDecorator.h
Go to the documentation of this file.
1 /*================================================================================================*/
2 /*
3  *
4  * Copyright 2014-2017, 2019 by Avid Technology, Inc.
5  * All rights reserved.
6  *
7  * CONFIDENTIAL: This document contains confidential information. Do not
8  * read or examine this document unless you are an Avid Technology employee
9  * or have signed a non-disclosure agreement with Avid Technology which protects
10  * the confidentiality of this document. DO NOT DISCLOSE ANY INFORMATION
11  * CONTAINED IN THIS DOCUMENT TO ANY THIRD-PARTY WITHOUT THE PRIOR WRITTEN CONSENT
12  * OF Avid Technology, INC.
13  *
14  */
15 
22 /*================================================================================================*/
23 
24 
25 #ifndef AAX_CUNITPREFIXDISPLAYDELEGATEDECORATOR_H
26 #define AAX_CUNITPREFIXDISPLAYDELEGATEDECORATOR_H
27 
29 
30 
61 template <typename T>
63 {
64 public:
66 
67  //Virtual overrides
69  bool ValueToString(T value, AAX_CString* valueString) const AAX_OVERRIDE;
70  bool ValueToString(T value, int32_t maxNumChars, AAX_CString* valueString) const AAX_OVERRIDE;
71  bool StringToValue(const AAX_CString& valueString, T* value) const AAX_OVERRIDE;
72 };
73 
74 
75 
76 template <typename T>
78  AAX_IDisplayDelegateDecorator<T>(displayDelegate)
79 {
80 
81 }
82 
83 
84 template <typename T>
86 {
88 }
89 
90 template <typename T>
92 {
93  //Find the proper unit prefix.
94  T absValue = fabsf(float(value)); //If you fail to compile on this line, you're trying to use this class with an integer type, which is not supported.
95  if (absValue >= 1000000.0)
96  {
97  value = value / ((T) 1000000.0);
98  bool succeeded = AAX_IDisplayDelegateDecorator<T>::ValueToString(value, valueString);
99  *valueString += AAX_CString("M");
100  return succeeded;
101  }
102  if (absValue >= ((T) 1000.0))
103  {
104  value = value / ((T) 1000.0);
105  bool succeeded = AAX_IDisplayDelegateDecorator<T>::ValueToString(value, valueString);
106  *valueString += AAX_CString("k");
107  return succeeded;
108  }
109  if (absValue >= ((T) 1.0))
110  {
111  return AAX_IDisplayDelegateDecorator<T>::ValueToString(value, valueString);
112  }
113  if (absValue >= ((T) 0.001))
114  {
115  value = value / ((T) 0.001);
116  bool succeeded = AAX_IDisplayDelegateDecorator<T>::ValueToString(value, valueString);
117  *valueString += AAX_CString("m");
118  return succeeded;
119  }
120  if (absValue >= ((T) 0.000001))
121  {
122  value = value / ((T) 0.000001);
123  bool succeeded = AAX_IDisplayDelegateDecorator<T>::ValueToString(value, valueString);
124  *valueString += AAX_CString("u");
125  return succeeded;
126  }
127  return AAX_IDisplayDelegateDecorator<T>::ValueToString(value, valueString);
128 }
129 
130 template <typename T>
131 bool AAX_CUnitPrefixDisplayDelegateDecorator<T>::ValueToString(T value, int32_t maxNumChars, AAX_CString* valueString) const
132 {
133  //Find the proper unit prefix.
134  //<DMT> The maxNumChars is decremented by 1 in case of the unit modifier being required as this is more important than precision.
135 
136  T absValue = fabsf(float(value)); //If you fail to compile on this line, you're trying to use this class with an integer type, which is not supported.
137  if (absValue >= 1000000.0)
138  {
139  value = value / ((T) 1000000.0);
140  bool succeeded = AAX_IDisplayDelegateDecorator<T>::ValueToString(value, maxNumChars-1, valueString);
141  *valueString += AAX_CString("M");
142  return succeeded;
143  }
144  if (absValue >= ((T) 1000.0))
145  {
146  value = value / ((T) 1000.0);
147  bool succeeded = AAX_IDisplayDelegateDecorator<T>::ValueToString(value, maxNumChars-1, valueString);
148  *valueString += AAX_CString("k");
149  return succeeded;
150  }
151  if (absValue >= ((T) 1.0))
152  {
153  return AAX_IDisplayDelegateDecorator<T>::ValueToString(value, maxNumChars, valueString);
154  }
155  if (absValue >= ((T) 0.001))
156  {
157  value = value / ((T) 0.001);
158  bool succeeded = AAX_IDisplayDelegateDecorator<T>::ValueToString(value, maxNumChars-1, valueString);
159  *valueString += AAX_CString("m");
160  return succeeded;
161  }
162  if (absValue >= ((T) 0.000001))
163  {
164  value = value / ((T) 0.000001);
165  bool succeeded = AAX_IDisplayDelegateDecorator<T>::ValueToString(value, maxNumChars-1, valueString);
166  *valueString += AAX_CString("u");
167  return succeeded;
168  }
169  return AAX_IDisplayDelegateDecorator<T>::ValueToString(value, maxNumChars, valueString);
170 }
171 
172 
173 template <typename T>
175 {
176  //Just call through if there is obviously no unit string.
177  if (valueString.Length() <= 1)
178  return AAX_IDisplayDelegateDecorator<T>::StringToValue(valueString, value);
179 
180  //Just call through if the end of this string does not match the unit string.
181  AAX_CString valueStringCopy(valueString);
182  T valueScalar = 1;
183  T valueDivScalar = 1;
184  switch(valueString[valueString.Length()-1])
185  {
186  case 'M':
187  valueScalar = ((T) 1000000.0);
188  valueStringCopy.Erase(valueString.Length()-1, 1);
189  break;
190  case 'k':
191  valueScalar = ((T) 1000.0);
192  valueStringCopy.Erase(valueString.Length()-1, 1);
193  break;
194  case 'm':
195  valueScalar = ((T) 0.001);
196  valueStringCopy.Erase(valueString.Length()-1, 1);
197  break;
198  case 'u':
199  // Rounding errors occur when trying to use 0.000001 so went to a div scalar instead.
200  // See bug https://audio-jira.avid.com/browse/PTSW-149426.
201  valueDivScalar = ((T) 1000000.0);
202  valueStringCopy.Erase(valueString.Length()-1, 1);
203  break;
204  }
205 
206  bool success = AAX_IDisplayDelegateDecorator<T>::StringToValue(valueStringCopy, value);
207  *value = valueScalar * (*value);
208  *value = (*value) / valueDivScalar;
209  return success;
210 }
211 
212 
213 
214 #endif //AAX_CUNITPREFIXDISPLAYDELEGATEDECORATOR
#define AAX_OVERRIDE
override keyword macro
Definition: AAX.h:141
The base class for all concrete display delegate decorators.
float fabsf(float iVal)
Definition: AAX_MiscUtils.h:185
A generic AAX string class with similar functionality to std::string
Definition: AAX_CString.h:46
uint32_t Length() const AAX_OVERRIDE
AAX_CString & Erase(uint32_t pos, uint32_t n)
A unit prefix decorator conforming to AAX_IDisplayDelegateDecorator.
Definition: AAX_CUnitPrefixDisplayDelegateDecorator.h:63
AAX_CUnitPrefixDisplayDelegateDecorator(const AAX_IDisplayDelegate< T > &displayDelegate)
Definition: AAX_CUnitPrefixDisplayDelegateDecorator.h:77
bool StringToValue(const AAX_CString &valueString, T *value) const AAX_OVERRIDE
Converts a string to a real parameter value.
Definition: AAX_CUnitPrefixDisplayDelegateDecorator.h:174
bool ValueToString(T value, AAX_CString *valueString) const AAX_OVERRIDE
Converts a real parameter value to a string representation.
Definition: AAX_CUnitPrefixDisplayDelegateDecorator.h:91
AAX_CUnitPrefixDisplayDelegateDecorator< T > * Clone() const AAX_OVERRIDE
Constructs and returns a copy of the display delegate.
Definition: AAX_CUnitPrefixDisplayDelegateDecorator.h:85
Classes for parameter value string conversion.
Definition: AAX_IDisplayDelegate.h:69
The base class for all concrete display delegate decorators.
Definition: AAX_IDisplayDelegateDecorator.h:44
bool StringToValue(const AAX_CString &valueString, T *value) const AAX_OVERRIDE
Converts a string to a real parameter value.
Definition: AAX_IDisplayDelegateDecorator.h:197
bool ValueToString(T value, AAX_CString *valueString) const AAX_OVERRIDE
Converts a string to a real parameter value.
Definition: AAX_IDisplayDelegateDecorator.h:185