Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/libs/conduit/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ set(conduit_c_headers
c/conduit.h
c/conduit_datatype.h
c/conduit_node.h
c/conduit_schema.h
c/conduit_cpp_to_c.hpp
c/conduit_utils.h
)
Expand Down Expand Up @@ -119,6 +120,7 @@ set(conduit_c_sources
c/conduit_c.cpp
c/conduit_datatype_c.cpp
c/conduit_node_c.cpp
c/conduit_schema_c.cpp
c/conduit_cpp_to_c.cpp
c/conduit_utils_c.cpp
)
Expand Down Expand Up @@ -218,4 +220,3 @@ if(FORTRAN_FOUND)
${CMAKE_Fortran_MODULE_DIRECTORY}/
DESTINATION include/conduit)
endif()

1 change: 1 addition & 0 deletions src/libs/conduit/c/conduit.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

#include "conduit_node.h"
#include "conduit_datatype.h"
#include "conduit_schema.h"
#include "conduit_utils.h"

//-----------------------------------------------------------------------------
Expand Down
81 changes: 79 additions & 2 deletions src/libs/conduit/c/conduit_cpp_to_c.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,9 +108,86 @@ cpp_datatype_ref(const conduit_datatype *cdatatype)
return *reinterpret_cast<const DataType*>(cdatatype);
}

struct conduit_schema_impl
{
Schema *schema;
bool owns;
};

//---------------------------------------------------------------------------//
Schema *
cpp_schema(conduit_schema *cschema)
{
if(cschema == NULL)
{
return NULL;
}
return reinterpret_cast<conduit_schema_impl*>(cschema)->schema;
}

//---------------------------------------------------------------------------//
conduit_schema *
c_schema(Schema *schema, bool owns)
{
conduit_schema_impl *handle = new conduit_schema_impl();
handle->schema = schema;
handle->owns = owns;
return reinterpret_cast<conduit_schema*>(handle);
}

//---------------------------------------------------------------------------//
const Schema *
cpp_schema(const conduit_schema *cschema)
{
if(cschema == NULL)
{
return NULL;
}
return reinterpret_cast<const conduit_schema_impl*>(cschema)->schema;
}

//---------------------------------------------------------------------------//
const conduit_schema *
c_schema(const Schema *schema, bool owns)
{
conduit_schema_impl *handle = new conduit_schema_impl();
handle->schema = const_cast<Schema*>(schema);
handle->owns = owns;
return reinterpret_cast<const conduit_schema*>(handle);
}

//---------------------------------------------------------------------------//
Schema &
cpp_schema_ref(conduit_schema *cschema)
{
return *reinterpret_cast<conduit_schema_impl*>(cschema)->schema;
}

//---------------------------------------------------------------------------//
const Schema &
cpp_schema_ref(const conduit_schema *cschema)
{
return *reinterpret_cast<const conduit_schema_impl*>(cschema)->schema;
}

//---------------------------------------------------------------------------//
void
destroy_cschema(conduit_schema *cschema)
{
if(cschema == NULL)
{
return;
}

conduit_schema_impl *handle = reinterpret_cast<conduit_schema_impl*>(cschema);
if(handle->owns)
{
delete handle->schema;
}
delete handle;
}

}
//-----------------------------------------------------------------------------
// -- end conduit:: --
//-----------------------------------------------------------------------------


20 changes: 20 additions & 0 deletions src/libs/conduit/c/conduit_cpp_to_c.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,26 @@ CONDUIT_API conduit::DataType &cpp_datatype_ref(conduit_datatype *cdatatype);
//---------------------------------------------------------------------------//
CONDUIT_API const conduit::DataType &cpp_datatype_ref(const conduit_datatype *datatype);

//---------------------------------------------------------------------------//
CONDUIT_API conduit::Schema *cpp_schema(conduit_schema *cschema);
//---------------------------------------------------------------------------//
CONDUIT_API conduit_schema *c_schema(conduit::Schema *schema, bool owns);

//---------------------------------------------------------------------------//
CONDUIT_API const conduit::Schema *cpp_schema(const conduit_schema *cschema);
//---------------------------------------------------------------------------//
CONDUIT_API const conduit_schema *c_schema(const conduit::Schema *schema, bool owns);

//---------------------------------------------------------------------------//
CONDUIT_API conduit::Schema &cpp_schema_ref(conduit_schema *cschema);
//---------------------------------------------------------------------------//
CONDUIT_API const conduit::Schema &cpp_schema_ref(const conduit_schema *cschema);

//---------------------------------------------------------------------------//
/// Destroys a schema handle created by c_schema(). If the handle owns the schema,
/// also deletes the underlying schema object.
CONDUIT_API void destroy_cschema(conduit_schema *cschema);

}
//-----------------------------------------------------------------------------
// -- end conduit:: --
Expand Down
6 changes: 6 additions & 0 deletions src/libs/conduit/c/conduit_node.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include "conduit_endianness_types.h"
#include "conduit_exports.h"
#include "conduit_datatype.h"
#include "conduit_schema.h"

//-----------------------------------------------------------------------------
// -- begin extern C
Expand Down Expand Up @@ -2496,6 +2497,11 @@ CONDUIT_API char* conduit_node_to_summary_string_with_options(const conduit_node
//-------------------------------------------------------------------------
CONDUIT_API const conduit_datatype *conduit_node_dtype(const conduit_node *cnode);

//-------------------------------------------------------------------------
// Get the schema for the node (borrowed pointer; do not free).
//-------------------------------------------------------------------------
CONDUIT_API const conduit_schema *conduit_node_schema(const conduit_node *cnode);

#ifdef __cplusplus
}
#endif
Expand Down
8 changes: 7 additions & 1 deletion src/libs/conduit/c/conduit_node_c.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4906,8 +4906,14 @@ conduit_node_dtype(const conduit_node *cnode)
return c_datatype(&(cpp_node(cnode)->dtype()));
}

//-----------------------------------------------------------------------------
const conduit_schema *
conduit_node_schema(const conduit_node *cnode)
{
return c_schema(&cpp_node_ref(cnode).schema(), false);
}

}
//-----------------------------------------------------------------------------
// -- end extern C
//-----------------------------------------------------------------------------

127 changes: 127 additions & 0 deletions src/libs/conduit/c/conduit_schema.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
// Copyright (c) Lawrence Livermore National Security, LLC and other Conduit
// Project developers. See top-level LICENSE AND COPYRIGHT files for dates and
// other details. No copyright assignment is required to contribute to Conduit.

//-----------------------------------------------------------------------------
///
/// file: conduit_schema.h
///
//-----------------------------------------------------------------------------

#ifndef CONDUIT_SCHEMA_H
#define CONDUIT_SCHEMA_H

#include <stdlib.h>
#include <stddef.h>

#include "conduit_bitwidth_style_types.h"
#include "conduit_exports.h"
#include "conduit_datatype.h"

//-----------------------------------------------------------------------------
// -- begin extern C
//-----------------------------------------------------------------------------
#ifdef __cplusplus
extern "C" {
#endif

//-----------------------------------------------------------------------------
// -- typedef for conduit_schema --
//-----------------------------------------------------------------------------

struct conduit_schema_impl;
typedef struct conduit_schema_impl conduit_schema;

//-----------------------------------------------------------------------------
// -- conduit_schema creation and destruction --
//-----------------------------------------------------------------------------

/// Creates a schema handle that owns its underlying schema.
CONDUIT_API conduit_schema *conduit_schema_create();

/// Destroys a schema handle. For owned handles, also frees the underlying schema.
CONDUIT_API void conduit_schema_destroy(conduit_schema *cschema);

/// Const-friendly variant of conduit_schema_destroy().
CONDUIT_API void conduit_schema_destroy_const(const conduit_schema *cschema);

//-----------------------------------------------------------------------------
// -- schema set / reset --
//-----------------------------------------------------------------------------

CONDUIT_API void conduit_schema_reset(conduit_schema *cschema);
CONDUIT_API void conduit_schema_set(conduit_schema *cschema,
const conduit_schema *cother);
CONDUIT_API void conduit_schema_set_dtype_id(conduit_schema *cschema,
conduit_index_t dtype_id);
CONDUIT_API void conduit_schema_set_datatype(conduit_schema *cschema,
const conduit_datatype *cdtype);
CONDUIT_API void conduit_schema_set_json(conduit_schema *cschema,
const char *json_schema);

//-----------------------------------------------------------------------------
// -- schema info --
//-----------------------------------------------------------------------------

CONDUIT_API const conduit_datatype *conduit_schema_dtype(const conduit_schema *cschema);
CONDUIT_API int conduit_schema_is_root(const conduit_schema *cschema);
CONDUIT_API int conduit_schema_is_compact(const conduit_schema *cschema);
CONDUIT_API int conduit_schema_compatible(const conduit_schema *cschema,
const conduit_schema *cother);
CONDUIT_API int conduit_schema_equals(const conduit_schema *cschema,
const conduit_schema *cother);
CONDUIT_API conduit_index_t conduit_schema_total_strided_bytes(const conduit_schema *cschema);
CONDUIT_API conduit_index_t conduit_schema_total_bytes_compact(const conduit_schema *cschema);

//-----------------------------------------------------------------------------
// -- object and list interface methods --
//-----------------------------------------------------------------------------

CONDUIT_API conduit_schema *conduit_schema_fetch(conduit_schema *cschema,
const char *path);
CONDUIT_API conduit_schema *conduit_schema_fetch_existing(conduit_schema *cschema,
const char *path);
CONDUIT_API conduit_schema *conduit_schema_append(conduit_schema *cschema);
CONDUIT_API conduit_schema *conduit_schema_add_child(conduit_schema *cschema,
const char *name);
CONDUIT_API conduit_schema *conduit_schema_child(conduit_schema *cschema,
conduit_index_t idx);
CONDUIT_API conduit_schema *conduit_schema_child_by_name(conduit_schema *cschema,
const char *name);
CONDUIT_API conduit_index_t conduit_schema_number_of_children(const conduit_schema *cschema);
CONDUIT_API int conduit_schema_has_child(const conduit_schema *cschema,
const char *name);
CONDUIT_API int conduit_schema_has_path(const conduit_schema *cschema,
const char *path);
CONDUIT_API void conduit_schema_rename_child(conduit_schema *cschema,
const char *current_name,
const char *new_name);
CONDUIT_API void conduit_schema_remove_path(conduit_schema *cschema,
const char *path);
CONDUIT_API void conduit_schema_remove_child(conduit_schema *cschema,
conduit_index_t idx);
CONDUIT_API void conduit_schema_remove_child_by_name(conduit_schema *cschema,
const char *name);

//-----------------------------------------------------------------------------
// -- schema strings --
//-----------------------------------------------------------------------------

CONDUIT_API char *conduit_schema_name(const conduit_schema *cschema);
CONDUIT_API char *conduit_schema_path(const conduit_schema *cschema);
CONDUIT_API char *conduit_schema_to_json(const conduit_schema *cschema);
CONDUIT_API char *conduit_schema_to_yaml(const conduit_schema *cschema);

//-----------------------------------------------------------------------------
/// Destroys strings returned by the conduit schema C API.
//-----------------------------------------------------------------------------
CONDUIT_API void conduit_schema_string_destroy(char *str);

#ifdef __cplusplus
}
#endif
//-----------------------------------------------------------------------------
// -- end extern C
//-----------------------------------------------------------------------------

#endif
Loading