blob: cb6a36c27e206eb28e7a259fd0b46b72c95338ea [file] [log] [blame]
/* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License, Version
* 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* etch_nativearray.h -- etch_nativarray implementation.
*/
#ifndef ETCH_NATIVEARRAY_H
#define ETCH_NATIVEARRAY_H
/**
* etch_nativearray
* object wrapper and methods for an n-dimensioned array of any type
* represented in memory as a single byte vector.
*/
#include "etch_object.h"
#ifdef __cplusplus
extern "C" {
#endif
// etch_nativearray defines
#define ETCH_MAX_NATIVE_DIM 3 /* arbitrary limit on native array dimensions */
/**
* etch_nativearray
*/
typedef struct etch_nativearray
{
etch_object object;
unsigned char is_content_owned;
void* values; /* flattened array content */
unsigned short content_obj_type; /* ETCHTYPEB_INT32 means content is int */
unsigned short content_class_id; /* CLASSID_NONE means content not wrapped */
int numdims; /* number of dimensions, e.g., 2 for x[3][4] */
/* this object may be masked by etch_collection_mask to determine content
* type and class, so do not add any fields above this comment */
size_t itemsize; /* size in bytes of an item, e.g. sizeof(int) */
size_t bytecount; /* length in bytes of array content (values) */
size_t dimension[ETCH_MAX_NATIVE_DIM]; /* for int x[2][3] [0] is 3, [1] is 2 */
size_t dimsize [ETCH_MAX_NATIVE_DIM]; /* for int x[2][3] [0] is 4, [1] is 12 */
size_t counts [ETCH_MAX_NATIVE_DIM]; /* optional actual population counts */
// dim size example
// int[2][3] array 2 * 3
//
// int[0][0] 4
// int[0][1] 8
// int[0][2] 12
// int[1][0] 16
// int[1][1] 20
// int[1][2] 24
// | dim size 0 = 4 | dim size 1 = 12 = 3 * sizeof(int)
// | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 |
int (*put1) (struct etch_nativearray*, void* v, int i);
int (*put2) (struct etch_nativearray*, void* v, int i, int j);
int (*put3) (struct etch_nativearray*, void* v, int i, int j, int k);
int (*get1) (struct etch_nativearray*, void* v, int i);
int (*get2) (struct etch_nativearray*, void* v, int i, int j);
int (*get3) (struct etch_nativearray*, void* v, int i, int j, int k);
} etch_nativearray;
etch_nativearray* new_etch_nativearray (unsigned short class_id, const size_t itemsize, const int numdims, const int dim0, const int dim1, const int dim2);
etch_nativearray* new_etch_nativearray_from (void* values, unsigned short class_id, const size_t itemsize, const int numdims, const int dim0, const int dim1, const int dim2);
etch_nativearray* new_etch_nativearray_of(unsigned short content_obj_type, unsigned short content_class_id, const int numdims, const int dim0, const int dim1, const int dim2);
etch_nativearray* new_subarray(etch_nativearray* a, const int i); etch_nativearray* etch_nativearray_assign_to(etch_nativearray*, etch_nativearray*);
etch_object* etch_nativearray_get_element(etch_nativearray*, const int i);
int etch_nativearray_get_component_type(etch_object* classobj, etch_component_type_params*);
int etch_nativearray_get_wrapped_component(etch_nativearray*, const int i, etch_object** out);
int destroy_etch_nativearray_content(etch_nativearray*);
int destroy_etch_nativearray(void*);
size_t etch_nativearray_off1 (etch_nativearray* a, int i);
size_t etch_nativearray_off2 (etch_nativearray* a, int i, int j);
size_t etch_nativearray_off3 (etch_nativearray* a, int i, int j, int k);
void* etch_nativearray_clone(void* other);
#ifdef __cplusplus
}
#endif
#endif /* #ifndef ETCH_MUTEX_H */