/* Copyright 2015-2020 The MathWorks, Inc. */

#ifndef MATLAB_EXCEPTION_HPP_
#define MATLAB_EXCEPTION_HPP_

#include "detail/ExceptionType.hpp"
#include "detail/exception_interface.hpp"

#include <string>
#include <exception>

namespace matlab {

/**
 * This is the base class for all External Data Interface exceptions.
 *
 * Concrete exception classes can inherit from std::exception or its subclasses (i.e.
 * std::bad_malloc) ONLY in cases when they are leaf classes.
 *
 */
class Exception {
  public:
    virtual ~Exception() MW_NOEXCEPT {
    }
    virtual const char* what() const MW_NOEXCEPT = 0;
};

using OutOfMemoryException =
    data::detail::ArrayException<matlab::Exception, data::ExceptionType::OutOfMemory>;

namespace data {
using InvalidArrayIndexException =
    detail::ArrayException<matlab::Exception, ExceptionType::InvalidArrayIndex>;
using TypeMismatchException =
    detail::ArrayException<matlab::Exception, ExceptionType::InvalidDataType>;
using InvalidArrayTypeException =
    detail::ArrayException<matlab::Exception, ExceptionType::InvalidArrayType>;
using InvalidMemoryLayoutException =
    detail::ArrayException<matlab::Exception, ExceptionType::InvalidMemoryLayout>;
using InvalidDimensionsInRowMajorArrayException =
    detail::ArrayException<matlab::Exception, ExceptionType::InvalidDimensionsInRowMajorArray>;
using InvalidTypeInRowMajorArrayException =
    detail::ArrayException<matlab::Exception, ExceptionType::InvalidTypeInRowMajorArray>;
using SystemErrorException = detail::ArrayException<matlab::Exception, ExceptionType::SystemError>;
using InvalidFieldNameException =
    detail::ArrayException<matlab::Exception, ExceptionType::InvalidFieldName>;
using FailedToLoadLibMatlabDataArrayException =
    detail::ArrayException<matlab::Exception, ExceptionType::FailedToLoadLibMatlabDataArray>;
using FailedToResolveSymbolException =
    detail::ArrayException<matlab::Exception, ExceptionType::FailedToResolveSymbol>;
using WrongNumberOfEnumsSuppliedException =
    detail::ArrayException<matlab::Exception, ExceptionType::WrongNumberOfEnumsSupplied>;
using MustSpecifyClassNameException =
    detail::ArrayException<matlab::Exception, ExceptionType::MustSpecifyClassName>;
using TooManyIndicesProvidedException =
    detail::ArrayException<matlab::Exception, ExceptionType::TooManyIndicesProvided>;
using NotEnoughIndicesProvidedException =
    detail::ArrayException<matlab::Exception, ExceptionType::NotEnoughIndicesProvided>;
using StringIndexMustBeLastException =
    detail::ArrayException<matlab::Exception, ExceptionType::StringIndexMustBeLast>;
using StringIndexNotValidException =
    detail::ArrayException<matlab::Exception, ExceptionType::StringIndexNotValid>;
using CanOnlyUseOneStringIndexException =
    detail::ArrayException<matlab::Exception, ExceptionType::CanOnlyUseOneStringIndex>;
using NonAsciiCharInInputDataException =
    detail::ArrayException<matlab::Exception, ExceptionType::NonAsciiCharInInputData>;
using NonAsciiCharInRequestedAsciiOutputException =
    detail::ArrayException<matlab::Exception, ExceptionType::NonAsciiCharInRequestedAsciiOutput>;
using InvalidDimensionsInSparseArrayException =
    detail::ArrayException<matlab::Exception, ExceptionType::InvalidDimensionsInSparseArray>;
using DuplicateFieldNameInStructArrayException =
    detail::ArrayException<matlab::Exception, ExceptionType::DuplicateFieldNameInStructArray>;
using CantIndexIntoEmptyArrayException =
    detail::ArrayException<matlab::Exception, ExceptionType::CantIndexIntoEmptyArray>;
using FeatureNotSupportedException =
    detail::ArrayException<matlab::Exception, ExceptionType::FeatureNotSupported>;
using NumberOfElementsExceedsMaximumException =
    detail::ArrayException<matlab::Exception, ExceptionType::NumberOfElementsExceedsMaximum>;
using ObjectArrayIncompatibleTypesException =
    detail::ArrayException<matlab::Exception, ExceptionType::InvalidHeterogeneousArray>;
using AccessingObjectNotSupportedException =
    detail::ArrayException<matlab::Exception, ExceptionType::ObjectNotAccessible>;
using InvalidNumberOfElementsProvidedException =
    detail::ArrayException<matlab::Exception, ExceptionType::InvalidNumberOfElementsProvided>;
} // namespace data
} // namespace matlab


#endif