/* Copyright 2017 The MathWorks, Inc. */ #ifndef MATLAB_DATA_VISITORS_HPP #define MATLAB_DATA_VISITORS_HPP #include #include #include "ArrayType.hpp" #include "TypedArray.hpp" #include "Struct.hpp" #include "Object.hpp" #include "ObjectArray.hpp" #include "StructArray.hpp" #include "EnumArray.hpp" #include "CharArray.hpp" #include "SparseArray.hpp" #include "Exception.hpp" #include "TypedArrayRef.hpp" #include "SparseArrayRef.hpp" namespace matlab { namespace data { template auto apply_visitor(Array a, V visitor) -> decltype (visitor(CharArray(std::move(a)))) { switch (a.getType()) { case ArrayType::CHAR: return(visitor(CharArray(std::move(a)))); case ArrayType::MATLAB_STRING: return(visitor(TypedArray(std::move(a)))); case ArrayType::LOGICAL: return(visitor(TypedArray(std::move(a)))); case ArrayType::DOUBLE: return(visitor(TypedArray(std::move(a)))); case ArrayType::SINGLE: return(visitor(TypedArray(std::move(a)))); case ArrayType::INT8: return(visitor(TypedArray(std::move(a)))); case ArrayType::UINT8: return(visitor(TypedArray(std::move(a)))); case ArrayType::INT16: return(visitor(TypedArray(std::move(a)))); case ArrayType::UINT16: return(visitor(TypedArray(std::move(a)))); case ArrayType::INT32: return(visitor(TypedArray(std::move(a)))); case ArrayType::UINT32: return(visitor(TypedArray(std::move(a)))); case ArrayType::INT64: return(visitor(TypedArray(std::move(a)))); case ArrayType::UINT64: return(visitor(TypedArray(std::move(a)))); case ArrayType::COMPLEX_DOUBLE: return(visitor(TypedArray>(std::move(a)))); case ArrayType::COMPLEX_SINGLE: return(visitor(TypedArray>(std::move(a)))); case ArrayType::COMPLEX_INT8: return(visitor(TypedArray>(std::move(a)))); case ArrayType::COMPLEX_UINT8: return(visitor(TypedArray>(std::move(a)))); case ArrayType::COMPLEX_INT16: return(visitor(TypedArray>(std::move(a)))); case ArrayType::COMPLEX_UINT16: return(visitor(TypedArray>(std::move(a)))); case ArrayType::COMPLEX_INT32: return(visitor(TypedArray>(std::move(a)))); case ArrayType::COMPLEX_UINT32: return(visitor(TypedArray>(std::move(a)))); case ArrayType::COMPLEX_INT64: return(visitor(TypedArray>(std::move(a)))); case ArrayType::COMPLEX_UINT64: return(visitor(TypedArray>(std::move(a)))); case ArrayType::CELL: return (visitor(TypedArray(std::move(a)))); case ArrayType::STRUCT: return (visitor(StructArray(std::move(a)))); case ArrayType::VALUE_OBJECT: return (visitor(ObjectArray(std::move(a)))); case ArrayType::HANDLE_OBJECT_REF: return(visitor(ObjectArray(std::move(a)))); case ArrayType::ENUM: return (visitor(EnumArray(std::move(a)))); case ArrayType::SPARSE_LOGICAL: return(visitor(SparseArray(std::move(a)))); case ArrayType::SPARSE_DOUBLE: return(visitor(SparseArray(std::move(a)))); case ArrayType::SPARSE_COMPLEX_DOUBLE: return(visitor(SparseArray>(std::move(a)))); default: throw InvalidArrayTypeException("Array has no type"); break; } /* switch */ } /* apply_visitor */ template auto apply_visitor_ref(const ArrayRef& a, V visitor) -> decltype (visitor(static_cast(a))) { switch (a.getType()) { case ArrayType::CHAR: return(visitor(static_cast(a))); case ArrayType::MATLAB_STRING: return(visitor(static_cast>(a))); case ArrayType::LOGICAL: return(visitor(static_cast>(a))); case ArrayType::DOUBLE: return(visitor(static_cast>(a))); case ArrayType::SINGLE: return(visitor(static_cast>(a))); case ArrayType::INT8: return(visitor(static_cast>(a))); case ArrayType::UINT8: return(visitor(static_cast>(a))); case ArrayType::INT16: return(visitor(static_cast>(a))); case ArrayType::UINT16: return(visitor(static_cast>(a))); case ArrayType::INT32: return(visitor(static_cast>(a))); case ArrayType::UINT32: return(visitor(static_cast>(a))); case ArrayType::INT64: return(visitor(static_cast>(a))); case ArrayType::UINT64: return(visitor(static_cast>(a))); case ArrayType::COMPLEX_DOUBLE: return(visitor(static_cast>>(a))); case ArrayType::COMPLEX_SINGLE: return(visitor(static_cast>>(a))); case ArrayType::COMPLEX_INT8: return(visitor(static_cast>>(a))); case ArrayType::COMPLEX_UINT8: return(visitor(static_cast>>(a))); case ArrayType::COMPLEX_INT16: return(visitor(static_cast>>(a))); case ArrayType::COMPLEX_UINT16: return(visitor(static_cast>>(a))); case ArrayType::COMPLEX_INT32: return(visitor(static_cast>>(a))); case ArrayType::COMPLEX_UINT32: return(visitor(static_cast>>(a))); case ArrayType::COMPLEX_INT64: return(visitor(static_cast>>(a))); case ArrayType::COMPLEX_UINT64: return(visitor(static_cast>>(a))); case ArrayType::CELL: return (visitor(static_cast>(a))); case ArrayType::STRUCT: return (visitor(static_cast(a))); case ArrayType::VALUE_OBJECT: return (visitor(static_cast>(a))); case ArrayType::HANDLE_OBJECT_REF: return(visitor(static_cast>(a))); case ArrayType::ENUM: return (visitor(static_cast(a))); case ArrayType::SPARSE_LOGICAL: return(visitor(static_cast>(a))); case ArrayType::SPARSE_DOUBLE: return(visitor(static_cast>(a))); case ArrayType::SPARSE_COMPLEX_DOUBLE: return(visitor(static_cast>>(a))); default: throw InvalidArrayTypeException("Array has no type"); break; } /* switch */ } /* apply_visitor */ } } #endif