/* Copyright 2015 The MathWorks, Inc. */

#ifndef OBJECT_INTERFACE_HPP_
#define OBJECT_INTERFACE_HPP_

#include "publish_util.hpp"

namespace matlab {
    namespace data {
        class ValueObject;
      
        namespace detail {
            class ReferenceImpl;
            class ForwardIteratorImpl;
            class RefCounted;
        }
        namespace impl {
            class ObjectImpl;
            class MatlabIdentifierImpl;
            class ArrayImpl;
        }
    }
}

MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C matlab::data::detail::ForwardIteratorImpl* object_begin(matlab::data::impl::ObjectImpl* impl);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C matlab::data::detail::ForwardIteratorImpl* object_end(matlab::data::impl::ObjectImpl* impl);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C matlab::data::detail::ForwardIteratorImpl* object_reference_begin(matlab::data::detail::ReferenceImpl* impl);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C matlab::data::detail::ForwardIteratorImpl* object_reference_end(matlab::data::detail::ReferenceImpl* impl);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C matlab::data::detail::ReferenceImpl* object_get_prop_ref(matlab::data::impl::ObjectImpl* impl, matlab::data::detail::RefCounted*, bool is_const_ref);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C matlab::data::detail::RefCounted* object_get_class_info(matlab::data::impl::ObjectImpl* impl);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C const char* object_get_enumeration_name(matlab::data::impl::ObjectImpl* impl);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C bool object_unshare(matlab::data::impl::ObjectImpl* impl, bool isUserObjectUnique, matlab::data::impl::ObjectImpl** newImpl); 
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C void object_set_value(matlab::data::detail::ReferenceImpl* impl, matlab::data::impl::ObjectImpl* rhs);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C void object_reference_shared_copy(matlab::data::detail::ReferenceImpl* impl, matlab::data::impl::ObjectImpl** cpy);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C void object_destroy_impl(matlab::data::impl::ObjectImpl* impl);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C void object_reference_get_reference_value(matlab::data::detail::ReferenceImpl* impl, const char* prop, size_t len, bool unshare, matlab::data::detail::ReferenceImpl** retVal);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C void object_reference_get_reference_value_with_id(matlab::data::detail::ReferenceImpl* impl, matlab::data::detail::RefCounted* prop, bool unshare, matlab::data::detail::ReferenceImpl** retVal);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C matlab::data::detail::RefCounted* object_array_get_class_info(matlab::data::impl::ArrayImpl* impl);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C matlab::data::detail::RefCounted* object_reference_get_class_info(matlab::data::detail::ReferenceImpl* impl);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C const char* object_reference_get_enumeration_name(matlab::data::detail::ReferenceImpl* impl);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C bool object_array_is_heterogeneous(matlab::data::impl::ArrayImpl* impl);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C bool handle_object_ref_is_equal(matlab::data::impl::ObjectImpl* lhs, matlab::data::impl::ObjectImpl* rhs);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C bool handle_object_ref_get_id(matlab::data::impl::ObjectImpl* impl, int64_t* retVal);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C bool handle_object_ref_get_mvm_id(matlab::data::impl::ObjectImpl* impl, int8_t* retVal);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C bool handle_ref_get_id(matlab::data::detail::ReferenceImpl* impl, int64_t* retVal);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C bool handle_ref_get_mvm_id(matlab::data::detail::ReferenceImpl* impl, int8_t* retVal);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C void handle_ref_set_value(matlab::data::detail::ReferenceImpl* impl, matlab::data::impl::ObjectImpl* rhs);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C bool handle_ref_is_equal(matlab::data::detail::ReferenceImpl* lhs, matlab::data::detail::ReferenceImpl* rhs);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C bool handle_ref_is_equal_to_object(matlab::data::detail::ReferenceImpl* lhs, matlab::data::impl::ObjectImpl* rhs);
MATLAB_EXTDATA_PUBLISHED_API_EXTERN_C void handle_object_ref_reference_shared_copy(matlab::data::detail::ReferenceImpl* impl, matlab::data::impl::ObjectImpl** cpy);

#endif