// Includes #include "XdmfArray.hpp" template class XdmfArray::CopyValues : public boost::static_visitor { public: CopyValues(int startIndex, T * valuesPointer, int numValues = 1, int arrayStride = 1, int valuesStride = 1) : mStartIndex(startIndex), mValuesPointer(valuesPointer), mNumValues(numValues), mArrayStride(arrayStride), mValuesStride(valuesStride) { } template void operator()(boost::shared_ptr > & array) 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) = (U)mValuesPointer[i*mValuesStride]; } } private: int mStartIndex; T* mValuesPointer; int mNumValues; int mArrayStride; int mValuesStride; }; struct XdmfArray::NullDeleter { void operator()(void const *) const { } }; template void XdmfArray::copyValues(int startIndex, T * valuesPointer, int numValues, int arrayStride, int valuesStride) { if(!mInitialized) { initialize(); } boost::apply_visitor( CopyValues(startIndex, valuesPointer, numValues, arrayStride, valuesStride), mArray); } template boost::shared_ptr > XdmfArray::getValues() { try { boost::shared_ptr > currArray = boost::get > >(mArray); return currArray; } catch(const boost::bad_get& exception) { return boost::shared_ptr >(); } } template const boost::shared_ptr > XdmfArray::getValues() const { try { boost::shared_ptr > currArray = boost::get > >(mArray); return currArray; } catch(const boost::bad_get& exception) { return boost::shared_ptr >(); } } template boost::shared_ptr > XdmfArray::initialize() { // Set type of variant to type of pointer boost::shared_ptr > newArray(new std::vector()); mArray = newArray; mInitialized = true; return newArray; } template void XdmfArray::setValues(std::vector & array) { boost::shared_ptr > newArray(&array, NullDeleter()); mArray = newArray; mInitialized = true; } template void XdmfArray::setValues(boost::shared_ptr > array) { mArray = array; mInitialized = true; } template bool XdmfArray::swap(std::vector & array) { if(!mInitialized) { initialize(); } try { boost::shared_ptr > currArray = boost::get > >(mArray); currArray->swap(array); if(currArray->size() == 0) { mInitialized = false; } return true; } catch(const boost::bad_get& exception) { return false; } } template bool XdmfArray::swap(boost::shared_ptr > array) { return this->swap(*array.get()); }