/* * XdmfArray.cpp * * Created on: Jan 29, 2010 * Author: kleiter */ #include "XdmfArray.hpp" #include "XdmfVisitor.hpp" #include class XdmfArrayClear : public boost::static_visitor { public: XdmfArrayClear() { } template void operator()(const boost::shared_ptr > & array) const { return array->clear(); } }; class XdmfArrayCopyArrayValues : public boost::static_visitor { public: XdmfArrayCopyArrayValues(int startIndex, int valuesStartIndex, int numValues, int arrayStride, int valuesStride) : mStartIndex(startIndex), mValuesStartIndex(valuesStartIndex), mNumValues(numValues), mArrayStride(arrayStride), mValuesStride(valuesStride) { } template void operator()(const boost::shared_ptr > & array, const boost::shared_ptr > & arrayToCopy) const { int size = mStartIndex + mNumValues; if(mArrayStride > 1) { size = mStartIndex + mNumValues * mArrayStride - 1; } if(array->size() < size) { array->resize(size); } for(int i=0; ioperator[](mStartIndex + i*mArrayStride) = (T)arrayToCopy->operator[](mValuesStartIndex + i*mValuesStride); } } private: int mStartIndex; int mValuesStartIndex; int mNumValues; int mArrayStride; int mValuesStride; }; class XdmfArrayGetHDF5Type : public boost::static_visitor { public: XdmfArrayGetHDF5Type() { } hid_t operator()(const boost::shared_ptr > & array) const { return H5T_NATIVE_CHAR; } hid_t operator()(const boost::shared_ptr > & array) const { return H5T_NATIVE_SHORT; } hid_t operator()(const boost::shared_ptr > & array) const { return H5T_NATIVE_INT; } hid_t operator()(const boost::shared_ptr > & array) const { return H5T_NATIVE_LONG; } hid_t operator()(const boost::shared_ptr > & array) const { return H5T_NATIVE_FLOAT; } hid_t operator()(const boost::shared_ptr > & array) const { return H5T_NATIVE_DOUBLE; } hid_t operator()(const boost::shared_ptr > & array) const { return H5T_NATIVE_UCHAR; } hid_t operator()(const boost::shared_ptr > & array) const { return H5T_NATIVE_USHORT; } hid_t operator()(const boost::shared_ptr > & array) const { return H5T_NATIVE_UINT; } }; class XdmfArrayGetPrecision : public boost::static_visitor { public: XdmfArrayGetPrecision() { } int operator()(const boost::shared_ptr > & array) const { return 1; } int operator()(const boost::shared_ptr > & array) const { return 2; } int operator()(const boost::shared_ptr > & array) const { return 4; } int operator()(const boost::shared_ptr > & array) const { return 8; } int operator()(const boost::shared_ptr > & array) const { return 4; } int operator()(const boost::shared_ptr > & array) const { return 8; } int operator()(const boost::shared_ptr > & array) const { return 1; } int operator()(const boost::shared_ptr > & array) const { return 2; } int operator()(const boost::shared_ptr > & array) const { return 4; } }; class XdmfArrayGetType : public boost::static_visitor { public: XdmfArrayGetType() { } std::string operator()(const boost::shared_ptr > & array) const { return "Char"; } std::string operator()(const boost::shared_ptr > & array) const { return "Short"; } std::string operator()(const boost::shared_ptr > & array) const { return "Int"; } std::string operator()(const boost::shared_ptr > & array) const { return "Int"; } std::string operator()(const boost::shared_ptr > & array) const { return "Float"; } std::string operator()(const boost::shared_ptr > & array) const { return "Float"; } std::string operator()(const boost::shared_ptr > & array) const { return "UChar"; } std::string operator()(const boost::shared_ptr > & array) const { return "UShort"; } std::string operator()(const boost::shared_ptr > & array) const { return "UInt"; } }; class XdmfArrayGetSize : public boost::static_visitor { public: XdmfArrayGetSize() { } template int operator()(const boost::shared_ptr > & array) const { return array->size(); } }; class XdmfArrayGetValuesPointer : public boost::static_visitor { public: XdmfArrayGetValuesPointer() { } template const void* const operator()(const boost::shared_ptr > & array) const { return &array->operator[](0); } }; class XdmfArrayGetValuesString : public boost::static_visitor { public: XdmfArrayGetValuesString() { } std::string operator()(const boost::shared_ptr > & array) const { std::stringstream toReturn; for(int i=0; isize(); ++i) { toReturn << (int)(array->operator[](i)) << " "; } return toReturn.str(); } template std::string operator()(const boost::shared_ptr > & array) const { std::stringstream toReturn; for(int i=0; isize(); ++i) { toReturn << array->operator[](i) << " "; } return toReturn.str(); } }; class XdmfArrayNewArray : public boost::static_visitor { public: XdmfArrayNewArray() { } template void operator()(boost::shared_ptr > & array) const { boost::shared_ptr > newArray(new std::vector()); array = newArray; } }; XdmfArray::XdmfArray() : mInitialized(false) { std::cout << "Created Array " << this << std::endl; } XdmfArray::~XdmfArray() { std::cout << "Deleted Array " << this << std::endl; } void XdmfArray::copyValues(int startIndex, boost::shared_ptr values, int valuesStartIndex, int numValues, int arrayStride, int valuesStride) { if(!mInitialized) { // Copy the values variant in order to get the type (only taking smart pointer so no worries about large copies) mArray = values->mArray; // Reinitialize variant array to contain new array with same type. boost::apply_visitor( XdmfArrayNewArray(), mArray); } boost::apply_visitor( XdmfArrayCopyArrayValues(startIndex, valuesStartIndex, numValues, arrayStride, valuesStride), mArray, values->mArray); } void XdmfArray::clear() { return boost::apply_visitor( XdmfArrayClear(), mArray); } hid_t XdmfArray::getHDF5Type() const { return boost::apply_visitor( XdmfArrayGetHDF5Type(), mArray); } int XdmfArray::getPrecision() const { return boost::apply_visitor( XdmfArrayGetPrecision(), mArray); } int XdmfArray::getSize() const { return boost::apply_visitor( XdmfArrayGetSize(), mArray); } std::string XdmfArray::getType() const { return boost::apply_visitor( XdmfArrayGetType(), mArray); } const void* const XdmfArray::getValuesPointer() const { return boost::apply_visitor( XdmfArrayGetValuesPointer(), mArray); } std::string XdmfArray::getValuesString() const { return boost::apply_visitor( XdmfArrayGetValuesString(), mArray); } std::string XdmfArray::printSelf() const { return ""; } void XdmfArray::write(boost::shared_ptr visitor) const { visitor->visit(this, visitor); }