Data Manual

About

maxon::Data is a generic container that can store any MAXON API data type (MAXON Data Type). It is typically used together with a maxon::DataDictionary which stores such maxon::Data elements, see DataDictionary Manual.

Creation

A new maxon::Data object can simply be created on the stack.

// This example creates new maxon::Data objects with various data.
// store maxon::String
data.Set("Hello World"_s) iferr_return;
// store maxon::Int
const maxon::Data integerData(123);
const maxon::DataType dataType = integerData.GetType();
if (dataType)
DiagnosticOutput("Type: @", dataType);
// store maxon::Float
const maxon::DataType floatDataType = maxon::GetDataType<maxon::Float>();
if (floatDataType)
{
maxon::Data floatData;
floatData.Init(floatDataType) iferr_return;
DiagnosticOutput("Float Data: @", floatData);
}

A given maxon::Data object can be inspected and reset with:

// This example checks if the given maxon::Data object is empty.
// If not the type of the stored data is printed to the debug console.
// After that, it is emptied.
if (data.IsPopulated())
{
// check type of the stored data
const maxon::DataType type = data.GetType();
if (type)
DiagnosticOutput("Type: @", type);
}
// clear data
data.Reset();
// check if data has been cleared
if (data.IsEmpty())
DiagnosticOutput("Data is now empty.");

Data

The key function of maxon::Data is to store and access data stored in the object:

// This example checks if the given maxon::Data object stores an maxon::Int32 value.
// If so, the stored value is increased.
// get maxon::Int32 type
const maxon::DataType integerType = maxon::GetDataType<maxon::Int32>();
if (!integerType)
return maxon::UnexpectedError(MAXON_SOURCE_LOCATION);
// check if data stores maxon::Int32 data
const maxon::DataType type = data.GetType();
if (type == integerType)
{
// increment data
number++;
data.Set(number) iferr_return;
DiagnosticOutput("Data: @", data);
}
// This example constructs a complex data type and sets its values.
// construct tuple data type
structTypes.Append(maxon::GetDataType<maxon::Int>()) iferr_return;
structTypes.Append(maxon::GetDataType<maxon::Float>()) iferr_return;
const maxon::TupleDataType tupleDataType = maxon::ParametricTypes::Tuple().Instantiate(structTypes) iferr_return;
// create data
data.Init(tupleDataType) iferr_return;
// access tuple
maxon::TupleValue* const tuple = data.GetTuple();
if (!tuple)
return maxon::UnexpectedError(MAXON_SOURCE_LOCATION);
// fill data
tuple->Get<maxon::Int>(0, tupleDataType) = 100;
tuple->Get<maxon::Float>(1, tupleDataType) = 100.0_f;
// check data
DiagnosticOutput("Data: @", data);

The data stored within a maxon::Data object can also be converted into another data type:

// This example converts the stored value into a maxon::Float value.
const maxon::Float floatData = data.Convert<maxon::Float>() iferr_return;
DiagnosticOutput("Float value: @", floatData);

Copy

The data stored in a maxon::Data object can easily be copied to another maxon::Data object.

// This example copies the data stored in the given maxon::Data object to two new objects.
// use CopyFrom()
maxon::Data copy1;
copy1.CopyFrom(data) iferr_return;
DiagnosticOutput("Copy: @", copy1);
// use GetCopy()
const maxon::Data copy2 = data.GetCopy() iferr_return;
DiagnosticOutput("Copy: @", copy2);

Compare

There are multiple ways to compare two given maxon::Data objects:

// This example compares the two given maxon::Data objects in multiple ways.
const maxon::COMPARERESULT res = dataA.Compare(dataB);
DiagnosticOutput("Data containers are equal.");
if (dataA.IsEqual(dataB))
DiagnosticOutput("Data containers are equal.");
if (dataA == dataB)
DiagnosticOutput("Data containers are equal.");

Utility

Further utility functions are:

// This example gets the maxon::String representation of the
// stored data and prints it to the console.
const maxon::String str = data.ToString(nullptr);
DiagnosticOutput("String: @", str);

Further Reading