21#include <pongasoft/logging/logging.h>
25#include <pluginterfaces/vst/vsttypes.h>
26#include <base/source/fstreamer.h>
38using namespace Steinberg;
39using namespace Steinberg::Vst;
83 oValue =
static_cast<T
>(iDiscreteValue);
90 oDiscreteValue =
static_cast<int32
>(iValue);
145 std::ostringstream s;
148 s.precision(iPrecision);
149 s.setf(std::ios::fixed);
156template<
typename T,
typename ParamType>
162 {
typename T::ParamType; } &&
171inline tresult
readDouble(IBStreamer &iStreamer,
double &oValue)
174 if(!iStreamer.readDouble(value))
181inline tresult
readFloat(IBStreamer &iStreamer,
float &oValue)
184 if(!iStreamer.readFloat(value))
191template<std::
integral Int>
194 for(Int i = 0; i < iCount; i++)
196 if(!iStreamer.readFloat(oValue[i]))
204inline tresult
readInt64(IBStreamer &iStreamer, int64 &oValue)
207 if(!iStreamer.readInt64(value))
214inline tresult
readInt64u(IBStreamer &iStreamer, uint64 &oValue)
217 if(!iStreamer.readInt64u(value))
224inline tresult
readInt32(IBStreamer &iStreamer, int32 &oValue)
227 if(!iStreamer.readInt32(value))
234inline tresult
readBool(IBStreamer &iStreamer,
bool &oValue)
237 if(!iStreamer.readBool(value))
258 oStreamer.writeDouble(iValue);
276 oStreamer.writeDouble(iValue);
294 oStreamer.writeInt32(iValue);
312 oStreamer.writeInt64(iValue);
324 std::string iTrueString =
"On") :
336 oStreamer.writeBool(iValue);
349 oValue = iDiscreteValue != 0;
355 oDiscreteValue = iValue ? 1 : 0;
370template<
int size = 128>
379 if(iStreamer.readRaw(
static_cast<void*
>(oValue), size) == size)
381 oValue[size - 1] = 0;
391 if(oStreamer.writeRaw(
static_cast<void const *
>(iValue), size) == size)
400 std::string_view sv(iValue, size);
401 auto pos = sv.find(
'\0');
402 if(pos != std::string_view::npos)
404 oStream << sv.substr(0, pos);
409 DLOG_F(WARNING,
"%.*s not properly null terminated!",
static_cast<int>(size), iValue);
441template<
typename T,
class Compare = std::less<T>>
447 using TMap = std::map<T, std::pair<std::string, int32>, Compare>;
455 using ConstructorType = std::initializer_list<std::pair<const T, std::string>>
const &;
464 auto stepCount =
static_cast<int32
>(iInitList.size() - 1);
465 DCHECK_F(stepCount > 0);
469 for(
auto &pair : iInitList)
471 fMap[pair.first] = std::make_pair(pair.second, i);
472 fList.emplace_back(pair.first);
486 if(iDiscreteValue < 0 || iDiscreteValue >
getStepCount())
488 oValue =
fList[iDiscreteValue];
495 auto iter =
fMap.find(iValue);
496 if(iter !=
fMap.cend())
498 oDiscreteValue = std::get<1>(iter->second);
503 DLOG_F(WARNING,
"could not convertToDiscreteValue...");
525 if(oStreamer.writeInt32(discreteValue))
535 auto iter =
fMap.find(iValue);
536 if(iter !=
fMap.cend())
538 oStream << std::get<0>(iter->second);
void writeToStream(ParamType const &iValue, std::ostream &oStream) const override
Definition ParamSerializers.h:340
int32 getStepCount() const override
Definition ParamSerializers.h:345
std::string fFalseString
Definition ParamSerializers.h:360
tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
This method should write iValue to the stream (aka serialization).
Definition ParamSerializers.h:334
tresult convertFromDiscreteValue(int32 iDiscreteValue, bool &oValue) const override
Definition ParamSerializers.h:347
std::string fTrueString
Definition ParamSerializers.h:361
tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
This method should read from the stream and populate oValue accordingly (aka deserialization).
Definition ParamSerializers.h:329
BooleanParamSerializer(std::string iFalseString="Off", std::string iTrueString="On")
Definition ParamSerializers.h:323
tresult convertToDiscreteValue(const bool &iValue, int32 &oDiscreteValue) const override
Definition ParamSerializers.h:353
A parameter backed by a C type string (char[size]).
Definition ParamSerializers.h:372
void writeToStream(ParamType const &iValue, std::ostream &oStream) const override
Definition ParamSerializers.h:398
char[size] ParamType
Definition ParamSerializers.h:374
tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
Definition ParamSerializers.h:389
tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
Definition ParamSerializers.h:377
void writeToStream(ParamType const &iValue, std::ostream &oStream) const override
By default, this implementation simply writes the value to the stream IF it is possible (determined a...
Definition ParamSerializers.h:533
int32 getStepCount() const override
Definition ParamSerializers.h:481
tresult convertToDiscreteValue(ParamType const &iValue, int32 &oDiscreteValue) const override
Definition ParamSerializers.h:493
tresult convertFromDiscreteValue(int32 iDiscreteValue, ParamType &oValue) const override
Definition ParamSerializers.h:484
std::map< T, std::pair< std::string, int32 >, Compare > TMap
Maintains the map of possible values of T (defined in constructor).
Definition ParamSerializers.h:447
tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
This method should write iValue to the stream (aka serialization).
Definition ParamSerializers.h:520
std::initializer_list< std::pair< const T, std::string > > const & ConstructorType
Defines the type for the constructor argument.
Definition ParamSerializers.h:455
std::vector< T > TList
Defines the mapping: discrete value [0, stepCount] to T.
Definition ParamSerializers.h:451
T ParamType
Definition ParamSerializers.h:457
TMap fMap
Definition ParamSerializers.h:543
tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
This method should read from the stream and populate oValue accordingly (aka deserialization).
Definition ParamSerializers.h:509
DiscreteTypeParamSerializer(ConstructorType iInitList)
Definition ParamSerializers.h:460
TList fList
Definition ParamSerializers.h:544
This parameter handles serializing a double parameter.
Definition ParamSerializers.h:267
tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
This method should write iValue to the stream (aka serialization).
Definition ParamSerializers.h:274
tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
This method should read from the stream and populate oValue accordingly (aka deserialization).
Definition ParamSerializers.h:269
Interface that defines a converter from a type T to an int32 given a number of steps (provided by get...
Definition ParamSerializers.h:49
virtual tresult convertToDiscreteValue(T const &iValue, int32 &oDiscreteValue) const =0
virtual tresult convertFromDiscreteValue(int32 iDiscreteValue, T &oValue) const =0
virtual ~IDiscreteConverter()=default
virtual int32 getStepCount() const =0
A vst parameter is represented by a ParamValue type which is a double in the range [0,...
Definition ParamSerializers.h:111
virtual std::string toString(ParamType const &iValue, int32 iPrecision) const
Definition ParamSerializers.h:143
virtual tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const
This method should read from the stream and populate oValue accordingly (aka deserialization).
Definition ParamSerializers.h:122
virtual tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const
This method should write iValue to the stream (aka serialization).
Definition ParamSerializers.h:128
virtual void writeToStream(ParamType const &iValue, std::ostream &oStream) const
By default, this implementation simply writes the value to the stream IF it is possible (determined a...
Definition ParamSerializers.h:135
T ParamType
Definition ParamSerializers.h:113
virtual ~IParamSerializer()=default
Destructor (needed for polymorphic base type).
This parameter handles serializing a int32 parameter.
Definition ParamSerializers.h:285
tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
This method should write iValue to the stream (aka serialization).
Definition ParamSerializers.h:292
tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
This method should read from the stream and populate oValue accordingly (aka deserialization).
Definition ParamSerializers.h:287
This parameter handles serializing a int64 parameter.
Definition ParamSerializers.h:303
tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
This method should write iValue to the stream (aka serialization).
Definition ParamSerializers.h:310
tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
This method should read from the stream and populate oValue accordingly (aka deserialization).
Definition ParamSerializers.h:305
This parameter handles serializing a raw parameter (ParamValue).
Definition ParamSerializers.h:249
tresult writeToStream(const ParamType &iValue, IBStreamer &oStreamer) const override
This method should write iValue to the stream (aka serialization).
Definition ParamSerializers.h:256
tresult readFromStream(IBStreamer &iStreamer, ParamType &oValue) const override
This method should read from the stream and populate oValue accordingly (aka deserialization).
Definition ParamSerializers.h:251
int32 getStepCount() const override
Definition ParamSerializers.h:77
tresult convertToDiscreteValue(T const &iValue, int32 &oDiscreteValue) const override
Definition ParamSerializers.h:88
int32 fStepCount
Definition ParamSerializers.h:96
tresult convertFromDiscreteValue(int32 iDiscreteValue, T &oValue) const override
Definition ParamSerializers.h:80
StaticCastDiscreteConverter(int32 iStepCount)
Definition ParamSerializers.h:71
Allows to detect whether a type defines ostream << x at compile time.
Definition Metaprogramming.h:103
Definition ParamSerializers.h:157
Defines the concept that matches IParamSerializer.
Definition ParamSerializers.h:161
static constexpr T clamp(const U &iValue, const T &iLower, const T &iUpper)
Make sure that the value remains within its bounds.
Definition Misc.h:34
constexpr auto ZERO_INT32
Definition Constants.h:25
IBStreamHelper - Helper functions.
Definition ParamSerializers.h:168
tresult readDouble(IBStreamer &iStreamer, double &oValue)
Definition ParamSerializers.h:171
tresult readFloat(IBStreamer &iStreamer, float &oValue)
Definition ParamSerializers.h:181
tresult readBool(IBStreamer &iStreamer, bool &oValue)
Definition ParamSerializers.h:234
tresult readInt64u(IBStreamer &iStreamer, uint64 &oValue)
Definition ParamSerializers.h:214
tresult readInt32(IBStreamer &iStreamer, int32 &oValue)
Definition ParamSerializers.h:224
tresult readInt64(IBStreamer &iStreamer, int64 &oValue)
Definition ParamSerializers.h:204
tresult readFloatArray(IBStreamer &iStreamer, float *oValue, Int iCount)
Definition ParamSerializers.h:192