diff --git a/CHANGELOG.md b/CHANGELOG.md index 900da8dca..a04f3689e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project aspires to adhere to [Semantic Versioning](https://semver.org/s #### Conduit - Added `CONDUIT_VERSION_VALUE` macro that encodes the current Conduit version as an integer. - Added a macro to make an integer a version number from major, minor, patch version numbers. Example: `CONDUIT_MAKE_VERSION_VALUE(0, 9, 6)`. This macro can be used to conditionally compile code that is valid for specific versions of Conduit. +- Added `set` methods to `DataAccessor` that take `DataArray`s and `DataAccessor`s. #### Blueprint - Finished `bent_multi_grid_amr` mesh by adding adjacency sets between spatially adjacent domains at the same level of refinement. diff --git a/src/docs/sphinx/tutorial_cpp_numeric.rst b/src/docs/sphinx/tutorial_cpp_numeric.rst index 02d95bd98..26c1fdb6b 100644 --- a/src/docs/sphinx/tutorial_cpp_numeric.rst +++ b/src/docs/sphinx/tutorial_cpp_numeric.rst @@ -135,7 +135,6 @@ Alternately, we can use a DataAccessor to do the conversion as needed. :start-after: BEGIN_EXAMPLE("numeric_data_accessor") :end-before: END_EXAMPLE("numeric_data_accessor") :language: cpp - :dedent: 4 .. literalinclude:: t_conduit_docs_tutorial_numeric_out.txt :start-after: BEGIN_EXAMPLE("numeric_data_accessor") @@ -152,6 +151,33 @@ array passed to it. The DataAccessor casts each value as needed on access, thus incurring a small cost at each access. The DataAccessor is also safer and simpler to use. +It is also possible to convert between DataAccessors and DataArrays using their +set methods. Below is an example of conversion from a DataArray to a DataAccessor. +It is possible to convert from a DataAccessor to a DataArray as well. + +.. code-block:: c++ + + int64 i_vals[4] = {100,200,300,400}; + + Node n; + n["ints"].set(i_vals, + 2, // # of elements + 0, // offset in bytes + sizeof(int64)*2); // stride in bytes + + int64_array vals_arr = n["ints"].value(); + n["floats"].set(DataType::float64(2)); + float64_accessor vals_acc = n["floats"].as_float64_accessor(); + vals_acc.set(vals_arr); + + std::cout << vals_acc[0] << std::endl; + std::cout << vals_acc[1] << std::endl; + +:: + + 100.0 + 300.0 + C++11 Initializer Lists ----------------------------------- diff --git a/src/libs/conduit/conduit_data_accessor.cpp b/src/libs/conduit/conduit_data_accessor.cpp index 24eec9923..d3ab5e1ce 100644 --- a/src/libs/conduit/conduit_data_accessor.cpp +++ b/src/libs/conduit/conduit_data_accessor.cpp @@ -16,6 +16,11 @@ #include #include +//----------------------------------------------------------------------------- +// -- conduit includes -- +//----------------------------------------------------------------------------- +#include "conduit_data_array.hpp" + //----------------------------------------------------------------------------- // -- begin conduit:: -- //----------------------------------------------------------------------------- @@ -379,6 +384,282 @@ DataAccessor::fill(T value) } } +//---------------------------------------------------------------------------// +//***************************************************************************// +// Set from DataAccessor +//***************************************************************************// +//---------------------------------------------------------------------------// + +//---------------------------------------------------------------------------// +// Set from DataAccessor signed integers +//---------------------------------------------------------------------------// + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataAccessor &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataAccessor &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataAccessor &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataAccessor &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +// Set from DataAccessor unsigned integers +//---------------------------------------------------------------------------// + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataAccessor &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataAccessor &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataAccessor &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataAccessor &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +// Set from DataAccessor floating point +//---------------------------------------------------------------------------// + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataAccessor &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataAccessor &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +//***************************************************************************// +// Set from DataArray +//***************************************************************************// +//---------------------------------------------------------------------------// + +//---------------------------------------------------------------------------// +// Set from DataArray signed integers +//---------------------------------------------------------------------------// + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataArray &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataArray &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataArray &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataArray &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +// Set from DataArray unsigned integers +//---------------------------------------------------------------------------// + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataArray &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataArray &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataArray &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataArray &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +// Set from DataArray floating point +//---------------------------------------------------------------------------// + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataArray &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + +//---------------------------------------------------------------------------// +template +void +DataAccessor::set(const DataArray &values) +{ + index_t num_elems = dtype().number_of_elements(); + for(index_t i=0; i set(i, (T)values[i]); + } +} + //---------------------------------------------------------------------------// template diff --git a/src/libs/conduit/conduit_data_accessor.hpp b/src/libs/conduit/conduit_data_accessor.hpp index 91ab4db0a..6f976c8ca 100644 --- a/src/libs/conduit/conduit_data_accessor.hpp +++ b/src/libs/conduit/conduit_data_accessor.hpp @@ -26,6 +26,12 @@ namespace conduit { +//----------------------------------------------------------------------------- +// -- forward declarations required for conduit::DataAccessor -- +//----------------------------------------------------------------------------- +template +class DataArray; + //----------------------------------------------------------------------------- // -- begin conduit::DataArray -- //----------------------------------------------------------------------------- @@ -98,7 +104,40 @@ class CONDUIT_API DataAccessor const DataType &dtype() const { return m_dtype;} - +//----------------------------------------------------------------------------- +// Setters +//----------------------------------------------------------------------------- + /// signed integer arrays via DataArray + void set(const DataArray &values); + void set(const DataArray &values); + void set(const DataArray &values); + void set(const DataArray &values); + + /// unsigned integer arrays via DataArray + void set(const DataArray &values); + void set(const DataArray &values); + void set(const DataArray &values); + void set(const DataArray &values); + + /// floating point arrays via DataArray + void set(const DataArray &values); + void set(const DataArray &values); + + /// signed integer arrays via DataAccessor + void set(const DataAccessor &values); + void set(const DataAccessor &values); + void set(const DataAccessor &values); + void set(const DataAccessor &values); + + /// unsigned integer arrays via DataAccessor + void set(const DataAccessor &values); + void set(const DataAccessor &values); + void set(const DataAccessor &values); + void set(const DataAccessor &values); + + /// floating point arrays via DataAccessor + void set(const DataAccessor &values); + void set(const DataAccessor &values); //----------------------------------------------------------------------------- // Transforms diff --git a/src/libs/conduit/conduit_data_array.cpp b/src/libs/conduit/conduit_data_array.cpp index df97f8ca8..124bc2741 100644 --- a/src/libs/conduit/conduit_data_array.cpp +++ b/src/libs/conduit/conduit_data_array.cpp @@ -23,6 +23,7 @@ #include "conduit_node.hpp" #include "conduit_utils.hpp" #include "conduit_log.hpp" +#include "conduit_data_accessor.hpp" // Easier access to the Conduit logging functions using namespace conduit::utils; diff --git a/src/libs/conduit/conduit_data_array.hpp b/src/libs/conduit/conduit_data_array.hpp index a21466fdd..0abb49d47 100644 --- a/src/libs/conduit/conduit_data_array.hpp +++ b/src/libs/conduit/conduit_data_array.hpp @@ -19,7 +19,6 @@ #include "conduit_core.hpp" #include "conduit_data_type.hpp" #include "conduit_utils.hpp" -#include "conduit_data_accessor.hpp" //----------------------------------------------------------------------------- // -- begin conduit:: -- @@ -27,6 +26,12 @@ namespace conduit { +//----------------------------------------------------------------------------- +// -- forward declarations required for conduit::DataArray -- +//----------------------------------------------------------------------------- +template +class DataAccessor; + //----------------------------------------------------------------------------- // -- begin conduit::DataArray -- //----------------------------------------------------------------------------- diff --git a/src/tests/conduit/t_conduit_data_accessor.cpp b/src/tests/conduit/t_conduit_data_accessor.cpp index 3e39c0e91..cfced5ca8 100644 --- a/src/tests/conduit/t_conduit_data_accessor.cpp +++ b/src/tests/conduit/t_conduit_data_accessor.cpp @@ -289,5 +289,255 @@ TEST(conduit_data_accessor, to_string) } +//----------------------------------------------------------------------------- +TEST(conduit_data_accessor, set_using_data_array) +{ + std::vector v_int8(10,-8); + std::vector v_int16(10,-16); + std::vector v_int32(10,-32); + std::vector v_int64(10,-64); + + std::vector v_uint8(10,8); + std::vector v_uint16(10,16); + std::vector v_uint32(10,32); + std::vector v_uint64(10,64); + + std::vector v_float32(10,32.0); + std::vector v_float64(10,64.0); + + int8_array va_int8(&v_int8[0],DataType::int8(10)); + int16_array va_int16(&v_int16[0],DataType::int16(10)); + int32_array va_int32(&v_int32[0],DataType::int32(10)); + int64_array va_int64(&v_int64[0],DataType::int64(10)); + + uint8_array va_uint8(&v_uint8[0],DataType::uint8(10)); + uint16_array va_uint16(&v_uint16[0],DataType::uint16(10)); + uint32_array va_uint32(&v_uint32[0],DataType::uint32(10)); + uint64_array va_uint64(&v_uint64[0],DataType::uint64(10)); + + float32_array va_float32(&v_float32[0],DataType::float32(10)); + float64_array va_float64(&v_float64[0],DataType::float64(10)); + + + Node n; + + // int8_array + n["vint8"].set(DataType::int8(10)); + n["vint8"].as_int8_accessor().set(va_int8); + int8 *n_int8_ptr = n["vint8"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_int8_ptr[i],va_int8[i]); + } + + // int16_array + n["vint16"].set(DataType::int16(10)); + n["vint16"].as_int16_accessor().set(va_int16); + int16 *n_int16_ptr = n["vint16"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_int16_ptr[i],va_int16[i]); + } + + // int32_array + n["vint32"].set(DataType::int32(10)); + n["vint32"].as_int32_accessor().set(va_int32); + int32 *n_int32_ptr = n["vint32"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_int32_ptr[i],va_int32[i]); + } + + // int64_array + n["vint64"].set(DataType::int64(10)); + n["vint64"].as_int64_accessor().set(va_int64); + int64 *n_int64_ptr = n["vint64"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_int64_ptr[i],va_int64[i]); + } + + // uint8_array + n["vuint8"].set(DataType::uint8(10)); + n["vuint8"].as_uint8_accessor().set(va_uint8); + uint8 *n_uint8_ptr = n["vuint8"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_uint8_ptr[i],va_uint8[i]); + } + + // uint16_array + n["vuint16"].set(DataType::uint16(10)); + n["vuint16"].as_uint16_accessor().set(va_uint16); + uint16 *n_uint16_ptr = n["vuint16"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_uint16_ptr[i],va_uint16[i]); + } + + // uint32_array + n["vuint32"].set(DataType::uint32(10)); + n["vuint32"].as_uint32_accessor().set(va_uint32); + uint32 *n_uint32_ptr = n["vuint32"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_uint32_ptr[i],va_uint32[i]); + } + + // uint64_array + n["vuint64"].set(DataType::uint64(10)); + n["vuint64"].as_uint64_accessor().set(va_uint64); + uint64 *n_uint64_ptr = n["vuint64"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_uint64_ptr[i],va_uint64[i]); + } + + + // float32_array + n["vfloat32"].set(DataType::float32(10)); + n["vfloat32"].as_float32_accessor().set(va_float32); + float32 *n_float32_ptr = n["vfloat32"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_float32_ptr[i],va_float32[i]); + } + + // float64_array + n["vfloat64"].set(DataType::float64(10)); + n["vfloat64"].as_float64_accessor().set(va_float64); + float64 *n_float64_ptr = n["vfloat64"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_float64_ptr[i],va_float64[i]); + } + +} + +//----------------------------------------------------------------------------- +TEST(conduit_data_accessor, set_using_data_accessor) +{ + std::vector v_int8(10,-8); + std::vector v_int16(10,-16); + std::vector v_int32(10,-32); + std::vector v_int64(10,-64); + + std::vector v_uint8(10,8); + std::vector v_uint16(10,16); + std::vector v_uint32(10,32); + std::vector v_uint64(10,64); + + std::vector v_float32(10,32.0); + std::vector v_float64(10,64.0); + + int8_accessor vacc_int8(&v_int8[0],DataType::int8(10)); + int16_accessor vacc_int16(&v_int16[0],DataType::int16(10)); + int32_accessor vacc_int32(&v_int32[0],DataType::int32(10)); + int64_accessor vacc_int64(&v_int64[0],DataType::int64(10)); + + uint8_accessor vacc_uint8(&v_uint8[0],DataType::uint8(10)); + uint16_accessor vacc_uint16(&v_uint16[0],DataType::uint16(10)); + uint32_accessor vacc_uint32(&v_uint32[0],DataType::uint32(10)); + uint64_accessor vacc_uint64(&v_uint64[0],DataType::uint64(10)); + + float32_accessor vacc_float32(&v_float32[0],DataType::float32(10)); + float64_accessor vacc_float64(&v_float64[0],DataType::float64(10)); + + + Node n; + + // int8_array + n["vint8"].set(DataType::int8(10)); + n["vint8"].as_int8_accessor().set(vacc_int8); + int8 *n_int8_ptr = n["vint8"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_int8_ptr[i],v_int8[i]); + } + + // int16_array + n["vint16"].set(DataType::int16(10)); + n["vint16"].as_int16_accessor().set(vacc_int16); + int16 *n_int16_ptr = n["vint16"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_int16_ptr[i],v_int16[i]); + } + + // int32_array + n["vint32"].set(DataType::int32(10)); + n["vint32"].as_int32_accessor().set(vacc_int32); + int32 *n_int32_ptr = n["vint32"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_int32_ptr[i],v_int32[i]); + } + + // int64_array + n["vint64"].set(DataType::int64(10)); + n["vint64"].as_int64_accessor().set(vacc_int64); + int64 *n_int64_ptr = n["vint64"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_int64_ptr[i],v_int64[i]); + } + + // uint8_array + n["vuint8"].set(DataType::uint8(10)); + n["vuint8"].as_uint8_accessor().set(vacc_uint8); + uint8 *n_uint8_ptr = n["vuint8"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_uint8_ptr[i],v_uint8[i]); + } + + // uint16_array + n["vuint16"].set(DataType::uint16(10)); + n["vuint16"].as_uint16_accessor().set(vacc_uint16); + uint16 *n_uint16_ptr = n["vuint16"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_uint16_ptr[i],v_uint16[i]); + } + + // uint32_array + n["vuint32"].set(DataType::uint32(10)); + n["vuint32"].as_uint32_accessor().set(vacc_uint32); + uint32 *n_uint32_ptr = n["vuint32"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_uint32_ptr[i],v_uint32[i]); + } + + // uint64_array + n["vuint64"].set(DataType::uint64(10)); + n["vuint64"].as_uint64_accessor().set(vacc_uint64); + uint64 *n_uint64_ptr = n["vuint64"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_uint64_ptr[i],v_uint64[i]); + } + + + // float32_array + n["vfloat32"].set(DataType::float32(10)); + n["vfloat32"].as_float32_accessor().set(vacc_float32); + float32 *n_float32_ptr = n["vfloat32"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_float32_ptr[i],v_float32[i]); + } + + // float64_array + n["vfloat64"].set(DataType::float64(10)); + n["vfloat64"].as_float64_accessor().set(vacc_float64); + float64 *n_float64_ptr = n["vfloat64"].value(); + for(index_t i=0;i<10;i++) + { + EXPECT_EQ(n_float64_ptr[i],v_float64[i]); + } + +} +