/*!
 *  Copyright (c) 2019 by Contributors
 * \file dgl/runtime/c_object_api.h
 *
 * \brief DGL Object C API, used to extend and prototype new CAPIs.
 *
 * \note Most API functions are registerd as PackedFunc and
 *  can be grabbed via DGLFuncGetGlobal
 */
#ifndef DGL_RUNTIME_C_OBJECT_API_H_
#define DGL_RUNTIME_C_OBJECT_API_H_

#include "./c_runtime_api.h"

#ifdef __cplusplus
extern "C" {
#endif

/*! \brief handle to object */
typedef void* ObjectHandle;

/*!
 * \brief free the object handle
 * \param handle The object handle to be freed.
 * \return 0 when success, -1 when failure happens
 */
DGL_DLL int DGLObjectFree(ObjectHandle handle);

/*!
 * \brief Convert type key to type index.
 * \param type_key The key of the type.
 * \param out_index the corresponding type index.
 * \return 0 when success, -1 when failure happens
 */
DGL_DLL int DGLObjectTypeKey2Index(const char* type_key, int* out_index);

/*!
 * \brief Get runtime type index of the object.
 * \param handle the object handle.
 * \param out_index the corresponding type index.
 * \return 0 when success, -1 when failure happens
 */
DGL_DLL int DGLObjectGetTypeIndex(ObjectHandle handle, int* out_index);

/*!
 * \brief get attributes given key
 * \param handle The object handle
 * \param key The attribute name
 * \param out_value The attribute value
 * \param out_type_code The type code of the attribute.
 * \param out_success Whether get is successful.
 * \return 0 when success, -1 when failure happens
 * \note API calls always exchanges with type bits=64, lanes=1
 */
DGL_DLL int DGLObjectGetAttr(
    ObjectHandle handle, const char* key, DGLValue* out_value,
    int* out_type_code, int* out_success);

/*!
 * \brief get attributes names in the object.
 * \param handle The object handle
 * \param out_size The number of functions
 * \param out_array The array of function names.
 * \return 0 when success, -1 when failure happens
 */
DGL_DLL int DGLObjectListAttrNames(
    ObjectHandle handle, int* out_size, const char*** out_array);
#ifdef __cplusplus
}  // DGL_EXTERN_C
#endif
#endif  // DGL_RUNTIME_C_OBJECT_API_H_
