diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2009-07-03 03:36:44 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2009-07-03 03:36:44 (GMT) |
commit | 41220f091117888c29a80949cd32fb99e7d877ea (patch) | |
tree | 98622abae20a29ed59152e8271c15c3b72bb0f04 /src/H5FAtest.c | |
parent | 84728ecf74516e616b2dc8f651489c487fc3088e (diff) | |
download | hdf5-41220f091117888c29a80949cd32fb99e7d877ea.zip hdf5-41220f091117888c29a80949cd32fb99e7d877ea.tar.gz hdf5-41220f091117888c29a80949cd32fb99e7d877ea.tar.bz2 |
[svn-r17154] Description:
Add fixed array data structure. (For initial use as a chunk index)
Tested on:
Mac OS X/32 10.5.7 (amazon)
(h5committest not required on this branch)
Diffstat (limited to 'src/H5FAtest.c')
-rw-r--r-- | src/H5FAtest.c | 391 |
1 files changed, 391 insertions, 0 deletions
diff --git a/src/H5FAtest.c b/src/H5FAtest.c new file mode 100644 index 0000000..c76c80b --- /dev/null +++ b/src/H5FAtest.c @@ -0,0 +1,391 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Programmer: + * + * Purpose: Fixed array testing functions. + * + */ + +/**********************/ +/* Module Declaration */ +/**********************/ + +#define H5FA_MODULE +#define H5FA_TESTING + + +/***********************/ +/* Other Packages Used */ +/***********************/ + + +/***********/ +/* Headers */ +/***********/ +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5FApkg.h" /* Fixed Arrays */ +#include "H5FLprivate.h" /* Free Lists */ +#include "H5Vprivate.h" /* Vector functions */ + + +/****************/ +/* Local Macros */ +/****************/ + +/* Sanity checking value for callback contexts */ +#define H5FA__TEST_BOGUS_VAL 42 + + +/******************/ +/* Local Typedefs */ +/******************/ + +/* Callback context */ +typedef struct H5FA__test_ctx_t { + uint32_t bogus; /* Placeholder field to verify that context is working */ +} H5FA__test_ctx_t; + + +/********************/ +/* Package Typedefs */ +/********************/ + + +/********************/ +/* Local Prototypes */ +/********************/ + +/* Fixed array class callbacks */ +static void *H5FA__test_crt_context(void *udata); +static herr_t H5FA__test_dst_context(void *ctx); +static herr_t H5FA__test_fill(void *nat_blk, size_t nelmts); +static herr_t H5FA__test_encode(void *raw, const void *elmt, size_t nelmts, + void *ctx); +static herr_t H5FA__test_decode(const void *raw, void *elmt, size_t nelmts, + void *ctx); +static herr_t H5FA__test_debug(FILE *stream, int indent, int fwidth, + hsize_t idx, const void *elmt); + + +/*********************/ +/* Package Variables */ +/*********************/ + +/* Fixed array testing class information */ +const H5FA_class_t H5FA_CLS_TEST[1]={{ + H5FA_CLS_TEST_ID, /* Type of Fixed array */ + "Testing", /* Name of fixed array class */ + sizeof(uint64_t), /* Size of native element */ + H5FA__test_crt_context, /* Create context */ + H5FA__test_dst_context, /* Destroy context */ + H5FA__test_fill, /* Fill block of missing elements callback */ + H5FA__test_encode, /* Element encoding callback */ + H5FA__test_decode, /* Element decoding callback */ + H5FA__test_debug /* Element debugging callback */ +}}; + + +/*****************************/ +/* Library Private Variables */ +/*****************************/ + + +/*******************/ +/* Local Variables */ +/*******************/ + +/* Declare a free list to manage the H5FA__test_ctx_t struct */ +H5FL_DEFINE_STATIC(H5FA__test_ctx_t); + + + +/*------------------------------------------------------------------------- + * Function: H5FA__test_crt_context + * + * Purpose: Create context for callbacks + * + * Return: Success: non-NULL + * Failure: NULL + * + * Programmer: Vailin Choi + * Thursday, April 30, 2009 + * + *------------------------------------------------------------------------- + */ +BEGIN_FUNC(STATIC, ERR, +void *, NULL, NULL, +H5FA__test_crt_context(void UNUSED *udata)) + + /* Local variables */ + H5FA__test_ctx_t *ctx; /* Context for callbacks */ + + /* Sanity checks */ + HDassert(udata); + + /* Allocate new context structure */ + if(NULL == (ctx = H5FL_MALLOC(H5FA__test_ctx_t))) + H5E_THROW(H5E_CANTALLOC, "can't allocate fixed array client callback context") + + /* Initialize the context */ + ctx->bogus = H5FA__TEST_BOGUS_VAL; + + /* Set return value */ + ret_value = ctx; + +CATCH + +END_FUNC(STATIC) /* end H5FA__test_crt_context() */ + + +/*------------------------------------------------------------------------- + * Function: H5FA__test_dst_context + * + * Purpose: Destroy context for callbacks + * + * Return: Success: non-negative + * Failure: negative + * + * Programmer: Vailin Choi + * Thursday, April 30, 2009 + * + *------------------------------------------------------------------------- + */ +BEGIN_FUNC(STATIC, NOERR, +herr_t, SUCCEED, -, +H5FA__test_dst_context(void *_ctx)) + + /* Local variables */ + H5FA__test_ctx_t *ctx = (H5FA__test_ctx_t *)_ctx; /* Callback context to destroy */ + + /* Sanity checks */ + HDassert(H5FA__TEST_BOGUS_VAL == ctx->bogus); + + /* Release context structure */ + ctx = H5FL_FREE(H5FA__test_ctx_t, ctx); + +END_FUNC(STATIC) /* end H5FA__test_dst_context() */ + + +/*------------------------------------------------------------------------- + * Function: H5FA__test_fill + * + * Purpose: Fill "missing elements" in block of elements + * + * Return: Success: non-negative + * Failure: negative + * + * Programmer: Vailin Choi + * Thursday, April 30, 2009 + * + *------------------------------------------------------------------------- + */ +BEGIN_FUNC(STATIC, NOERR, +herr_t, SUCCEED, -, +H5FA__test_fill(void *nat_blk, size_t nelmts)) + + /* Local variables */ + uint64_t fill_val = H5FA_TEST_FILL; /* Value to fill elements with */ + + /* Sanity checks */ + HDassert(nat_blk); + HDassert(nelmts); + + H5V_array_fill(nat_blk, &fill_val, sizeof(uint64_t), nelmts); + +END_FUNC(STATIC) /* end H5FA__test_fill() */ + + +/*------------------------------------------------------------------------- + * Function: H5FA__test_encode + * + * Purpose: Encode an element from "native" to "raw" form + * + * Return: Success: non-negative + * Failure: negative + * + * Programmer: Vailin Choi + * Thursday, April 30, 2009 + * + *------------------------------------------------------------------------- + */ +BEGIN_FUNC(STATIC, NOERR, +herr_t, SUCCEED, -, +H5FA__test_encode(void *raw, const void *_elmt, size_t nelmts, void *_ctx)) + + /* Local variables */ + H5FA__test_ctx_t *ctx = (H5FA__test_ctx_t *)_ctx; /* Callback context to destroy */ + const uint64_t *elmt = (const uint64_t *)_elmt; /* Convenience pointer to native elements */ + + /* Sanity checks */ + HDassert(raw); + HDassert(elmt); + HDassert(nelmts); + HDassert(H5FA__TEST_BOGUS_VAL == ctx->bogus); + + /* Encode native elements into raw elements */ + while(nelmts) { + /* Encode element */ + /* (advances 'raw' pointer) */ + UINT64ENCODE(raw, *elmt); + + /* Advance native element pointer */ + elmt++; + + /* Decrement # of elements to encode */ + nelmts--; + } /* end while */ + +END_FUNC(STATIC) /* end H5FA__test_encode() */ + + +/*------------------------------------------------------------------------- + * Function: H5FA__test_decode + * + * Purpose: Decode an element from "raw" to "native" form + * + * Return: Success: non-negative + * Failure: negative + * + * Programmer: Vailin Choi + * Thursday, April 30, 2009 + * + *------------------------------------------------------------------------- + */ +BEGIN_FUNC(STATIC, NOERR, +herr_t, SUCCEED, -, +H5FA__test_decode(const void *_raw, void *_elmt, size_t nelmts, void *_ctx)) + + /* Local variables */ + H5FA__test_ctx_t *ctx = (H5FA__test_ctx_t *)_ctx; /* Callback context to destroy */ + uint64_t *elmt = (uint64_t *)_elmt; /* Convenience pointer to native elements */ + const uint8_t *raw = (const uint8_t *)_raw; /* Convenience pointer to raw elements */ + + /* Sanity checks */ + HDassert(raw); + HDassert(elmt); + HDassert(nelmts); + HDassert(H5FA__TEST_BOGUS_VAL == ctx->bogus); + + /* Decode raw elements into native elements */ + while(nelmts) { + /* Decode element */ + /* (advances 'raw' pointer) */ + UINT64DECODE(raw, *elmt); + + /* Advance native element pointer */ + elmt++; + + /* Decrement # of elements to decode */ + nelmts--; + } /* end while */ + +END_FUNC(STATIC) /* end H5FA__test_decode() */ + + +/*------------------------------------------------------------------------- + * Function: H5FA__test_debug + * + * Purpose: Display an element for debugging + * + * Return: Success: non-negative + * Failure: negative + * + * Programmer: Vailin Choi + * Thursday, April 30, 2009 + * + *------------------------------------------------------------------------- + */ +BEGIN_FUNC(STATIC, NOERR, +herr_t, SUCCEED, -, +H5FA__test_debug(FILE *stream, int indent, int fwidth, hsize_t idx, + const void *elmt)) + + /* Local variables */ + char temp_str[128]; /* Temporary string, for formatting */ + + /* Sanity checks */ + HDassert(stream); + HDassert(elmt); + + /* Print element */ + sprintf(temp_str, "Element #%llu:", (unsigned long long)idx); + HDfprintf(stream, "%*s%-*s %llu\n", indent, "", fwidth, temp_str, + (unsigned long long)*(const uint64_t *)elmt); + +END_FUNC(STATIC) /* end H5FA__test_debug() */ + + +/*------------------------------------------------------------------------- + * Function: H5FA_get_cparam_test + * + * Purpose: Retrieve the parameters used to create the fixed array + * + * Return: Success: non-negative + * Failure: negative + * + * Programmer: Vailin Choi + * Thursday, April 30, 2009 + * + *------------------------------------------------------------------------- + */ +BEGIN_FUNC(PRIV, NOERR, +herr_t, SUCCEED, -, +H5FA_get_cparam_test(const H5FA_t *fa, H5FA_create_t *cparam)) + + /* Check arguments. */ + HDassert(fa); + HDassert(cparam); + + /* Get fixed array creation parameters */ + cparam->raw_elmt_size = fa->hdr->cparam.raw_elmt_size; + cparam->nelmts = fa->hdr->cparam.nelmts; + +END_FUNC(PRIV) /* end H5FA_get_cparam_test() */ + + +/*------------------------------------------------------------------------- + * Function: H5FA_cmp_cparam_test + * + * Purpose: Compare the parameters used to create the fixed array + * + * Return: Success: non-negative + * Failure: negative + * + * Programmer: Vailin Choi + * Thursday, April 30, 2009 + * + *------------------------------------------------------------------------- + */ +BEGIN_FUNC(PRIV, ERRCATCH, +int, 0, -, +H5FA_cmp_cparam_test(const H5FA_create_t *cparam1, const H5FA_create_t *cparam2)) + + /* Check arguments. */ + HDassert(cparam1); + HDassert(cparam2); + + /* Compare creation parameters for array */ + if(cparam1->raw_elmt_size < cparam2->raw_elmt_size) + H5_LEAVE(-1) + else if(cparam1->raw_elmt_size > cparam2->raw_elmt_size) + H5_LEAVE(1) + +CATCH + +END_FUNC(PRIV) /* end H5FA_cmp_cparam_test() */ + |