blob: 2f550725d2cecd815d44dbe6b82886240df9ab6c [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_validator.h
*/
#ifndef ETCH_VALIDATOR_H
#define ETCH_VALIDATOR_H
#include "etch_object.h"
#include "etch_type.h"
#ifdef __cplusplus
extern "C" {
#endif
#define ETCHVTOR_MAX_NDIMS 3 /* max array dimensions */
#define ETCHVTOR_MAX_CACHED 4 /* max cached vtors per type */
struct etch_validator;
typedef int (*etchvtor_validate) (struct etch_validator*, etch_object*);
typedef int (*etchvtor_checkvalue)(struct etch_validator*, etch_object*, byte* out);
typedef etch_object* (*etchvtor_validate_value)(struct etch_validator*, etch_object*);
typedef struct etch_validator* (*etchvtor_element_validator)(struct etch_validator*);
/**
* etch_validator
* vet message values
*/
typedef struct etch_validator
{
etch_object object;
/**
* etch_validator virtuals
*/
etchvtor_validate validate;
etchvtor_checkvalue check_value;
etchvtor_validate_value validate_value;
etchvtor_element_validator element_validator;
/**
* etch_type_validator instance data
*/
unsigned short expected_obj_type;
unsigned short expected_class_id;
int numdimensions;
char* description; /* owned */
etch_type* struct_type; /* not owned */
etchparentinfo* inherits_from; /* owned or not, see flag */
unsigned char is_cached;
unsigned char is_subclassable;
unsigned char is_owned_inherits_from;
unsigned char unused;
/* etch_combo_validator instance data
*/
struct etch_validator* vtor_a; /* not owned */
struct etch_validator* vtor_b; /* not owned */
} etch_validator;
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* validator constructors and public methods
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
etch_validator* new_validator();
etch_validator* new_validator_from(etchvtor_validate, etchvtor_checkvalue, etchvtor_element_validator, etchvtor_validate_value);
etch_validator* new_type_validator_1
(const unsigned short vtor_classid,
const unsigned short scalar_obj_type,
const unsigned short scalar_classid,
const unsigned short scalar_vtabkey,
const unsigned short array_classid,
const int ndims, char* descr);
etch_validator* new_type_validator_2
(const unsigned short vtor_classid,
const unsigned short scalar_obj_type,
const unsigned short scalar_classid,
const unsigned short array_classid,
etchparentinfo* inheritlist,
const int ndims, char* descr);
int etchvtor_check_dimensions(const int);
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* validator cache
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
/* the validator cache is a single memory array, subdivided into caches for
* each validator type, which caches instantiated validators. validators are
* cached to a max number of dimensions. end of service processing should
* iterate the static cache and free memory for validators cached therein,
* in order for memory allocation tests to pass. validators have an is_cached
* flag, regarded by the etch_validator dtor, so validator user can destroy()
* validator regardless of its cache state, the dtor will check the flag and
* refuse to destroy if cached. the final cleanup must therefore clear the
* is_cached marker on each cached validator prior to calling destroy().
*/
#define ETCHVTOR_CACHED_TYPE_COUNT 12 /* count of cached validator types */
#define ETCHVTOR_BYTES_PER_CACHE (sizeof(void*) * ETCHVTOR_MAX_CACHED)
// the validator cache
extern etch_validator* etchvtor_cache[ETCHVTOR_CACHED_TYPE_COUNT * ETCHVTOR_MAX_CACHED];
void etchvtor_clear_cache();
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* boolean validator
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
#define ETCHVTOR_CACHE_SLOT_BOOLEAN 0 /* boolean validator cache slot index */
extern etch_validator** etchvtor_cache_boolean; /* boolean validator cache address */
etch_validator* etchvtor_boolean_get(const int dimensions);
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* byte validator
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
#define ETCHVTOR_CACHE_SLOT_BYTE 1 /* byte validator cache slot index */
extern etch_validator** etchvtor_cache_byte; /* byte validator cache address */
etch_validator* etchvtor_byte_get(const int dimensions);
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* int8 validator
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
#define ETCHVTOR_CACHE_SLOT_INT8 2 /* int8 validator cache slot index */
extern etch_validator** etchvtor_cache_int8; /* int8 validator cache address */
etch_validator* etchvtor_int8_get(const int dimensions);
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* int16 validator
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
#define ETCHVTOR_CACHE_SLOT_INT16 3 /* int16 validator cache slot index */
extern etch_validator** etchvtor_cache_int16; /* int16 validator cache address */
etch_validator* etchvtor_int16_get(const int dimensions);
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* int32 validator
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
#define ETCHVTOR_CACHE_SLOT_INT32 4 /* int32 validator cache slot index */
extern etch_validator** etchvtor_cache_int32; /* int32 validator cache address */
etch_validator* etchvtor_int32_get(const int dimensions);
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* int64 validator
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
#define ETCHVTOR_CACHE_SLOT_INT64 5 /* int64 validator cache slot index */
extern etch_validator** etchvtor_cache_int64; /* int64 validator cache address */
etch_validator* etchvtor_int64_get(const int dimensions);
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* float validator
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
#define ETCHVTOR_CACHE_SLOT_FLOAT 6 /* float validator cache slot index */
extern etch_validator** etchvtor_cache_float; /* float validator cache address */
etch_validator* etchvtor_float_get (const int dimensions);
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* double validator
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
#define ETCHVTOR_CACHE_SLOT_DOUBLE 7 /* double validator cache slot index */
extern etch_validator** etchvtor_cache_double; /* double validator cache address */
etch_validator* etchvtor_double_get (const int dimensions);
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* string validator
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
#define ETCHVTOR_CACHE_SLOT_STRING 8 /* string validator cache slot index */
extern etch_validator** etchvtor_cache_string; /* string validator cache address */
etch_validator* etchvtor_string_get (const int dimensions);
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* object validator (etch_object* anonymous wrapper)
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
#define ETCHVTOR_CACHE_SLOT_OBJECT 9 /* object validator cache slot index */
extern etch_validator** etchvtor_cache_object; /* object validator cache address */
etch_validator* etchvtor_object_get (const int dimensions);
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* exception validator
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
#define ETCHVTOR_CACHE_SLOT_EXCEPTION 10 /* excp validator cache slot index */
extern etch_validator** etchvtor_cache_exception; /* excp validator cache address */
etch_validator* etchvtor_exception_get();
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* eod_validator (end-of-data maker "none")
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
#define ETCHVTOR_CACHE_SLOT_EOD 11 /* eod validator cache slot index */
extern etch_validator** etchvtor_cache_eod; /* eod validator cache address */
etch_validator* etchvtor_eod_get();
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* struct validator (not cached since unique per type)
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
etch_validator* new_validator_struct();
etch_validator* etchvtor_struct_get(etch_type*, const int numdims);
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* combo validator (not cached)
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
etch_validator* new_combo_validator(etch_validator* vtor_a, etch_validator* vtor_b);
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* custom validator (cached in a custom cache)
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
etch_validator* new_validator_custom(const unsigned short obj_type, const unsigned short class_id, etch_type*, const int numdims);
etch_validator* etchvtor_custom_get(const unsigned short obj_type, const unsigned short class_id, etch_type*, const int numdims);
#ifdef __cplusplus
}
#endif
#endif /* #ifndef ETCH_VALIDATOR_H */