summaryrefslogtreecommitdiffstats
path: root/src/H5Sprivate.h
blob: 25e758e7ae5e566fcb6ce4d1abf794cfae435d08 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/****************************************************************************
 * NCSA HDF                                                                 *
 * Software Development Group                                               *
 * National Center for Supercomputing Applications                          *
 * University of Illinois at Urbana-Champaign                               *
 * 605 E. Springfield, Champaign IL 61820                                   *
 *                                                                          *
 * For conditions of distribution and use, see the accompanying             *
 * hdf/COPYING file.                                                        *
 *                                                                          *
 ****************************************************************************/

/*
 * This file contains private information about the H5S module
 */
#ifndef _H5Sprivate_H
#define _H5Sprivate_H

#include <H5Spublic.h>

/* Private headers needed by this file */
#include <H5private.h>
#include <H5Gprivate.h>         /*for H5G_entry_t                            */
#include <H5Oprivate.h>

#define H5S_RESERVED_ATOMS  2

/* Flags to indicate special dataspace features are active */
#define H5S_VALID_MAX   0x01
#define H5S_VALID_PERM  0x02

typedef struct H5S_hyperslab_t {
    intn        *start;                 /* Location of start of hyperslab */
    size_t      *count;                 /* Number of elements in hyperslab */
    size_t      *stride;                /* Packing of values of hyperslab */
} H5S_hyperslab_t;

typedef struct H5S_simple_t {
    intn        rank;                   /*number of dimensions               */
    size_t      *size;                  /*dimension sizes                    */
    size_t      *max;                   /*maximum dimension sizes or NULL    */
    intn        *perm;                  /*dimension permutations or NULL     */
} H5S_simple_t;

typedef struct H5S_t {
    H5S_class_t         type;           /*type of dimensionality object      */
    union {
        H5S_simple_t    simple;         /*simple dimensionality information  */
    } u;
    uintn hslab_def;                    /* Whether the hyperslab is defined */
    H5S_hyperslab_t h;                  /* Hyperslab information */
} H5S_t;

/*
 * This structure contains information about how the elements of a data space
 * are numbered.
 */
typedef struct H5S_number_t {
    int _place_holder;                  /*remove this field!                 */
} H5S_number_t;

/*
 * Callbacks for data space conversion.
 */
typedef struct H5S_tconv_t {
    /* Initialize element numbering information */
    size_t (*init)(const struct H5O_layout_t *layout, const H5S_t *mem_space,
                   const H5S_t *file_space, H5S_number_t *numbering/*out*/);

    /* Gather elements from disk to type conversion buffer */
    size_t (*fgath)(H5F_t *f, const struct H5O_layout_t *layout,
                    size_t elmt_size, const H5S_t *file_space,
                    const H5S_number_t *numbering, size_t start, size_t nelmts,
                    void *tconv_buf/*out*/);

    /* Scatter elements from type conversion buffer to application buffer */
    herr_t (*mscat)(const void *tconv_buf, size_t elmt_size,
                    const H5S_t *mem_space, const H5S_number_t *numbering,
                    size_t start, size_t nelmts, void *buf/*out*/);

    /* Gather elements from app buffer to type conversion buffer */
    size_t (*mgath)(const void *buf, size_t elmt_size,
                    const H5S_t *mem_space, const H5S_number_t *numbering,
                    size_t start, size_t nelmts, void *tconv_buf/*out*/);

    /* Scatter elements from type conversion buffer to disk */
    herr_t (*fscat)(H5F_t *f, const struct H5O_layout_t *layout,
                    size_t elmt_size, const H5S_t *file_space,
                    const H5S_number_t *numbering, size_t start, size_t nelmts,
                    const void *tconv_buf);
} H5S_conv_t;

H5S_t *H5S_copy (const H5S_t *src);
herr_t H5S_close (H5S_t *ds);
size_t H5S_get_npoints (const H5S_t *ds);
intn H5S_get_ndims (const H5S_t *ds);
intn H5S_get_dims (const H5S_t *ds, size_t dims[]/*out*/);
herr_t H5S_modify (H5G_entry_t *ent, const H5S_t *space);
H5S_t *H5S_read (H5F_t *f, H5G_entry_t *ent);
intn H5S_cmp (const H5S_t *ds1, const H5S_t *ds2);
hbool_t H5S_is_simple (const H5S_t *sdim);
uintn H5S_nelem (const H5S_t *space);
const H5S_conv_t *H5S_find (const H5S_t *mem_space, const H5S_t *file_space);
intn H5S_get_hyperslab (const H5S_t *ds, int offset[]/*out*/,
			size_t size[]/*out*/, size_t stride[]/*out*/);
intn H5S_extend (H5S_t *space, const size_t *size);

/* Conversion functions for simple data spaces */
size_t H5S_simp_init (const struct H5O_layout_t *layout,
                      const H5S_t *mem_space, const H5S_t *file_space,
                      H5S_number_t *numbering/*out*/);
size_t H5S_simp_fgath (H5F_t *f, const struct H5O_layout_t *layout,
                       size_t elmt_size, const H5S_t *file_space,
                       const H5S_number_t *numbering, size_t start,
                       size_t nelmts, void *tconv_buf/*out*/);
herr_t H5S_simp_mscat (const void *tconv_buf, size_t elmt_size,
                       const H5S_t *mem_space, const H5S_number_t *numbering,
                       size_t start, size_t nelmts, void *buf/*out*/);
size_t H5S_simp_mgath (const void *buf, size_t elmt_size,
                       const H5S_t *mem_space, const H5S_number_t *numbering,
                       size_t start, size_t nelmts, void *tconv_buf/*out*/);
herr_t H5S_simp_fscat (H5F_t *f, const struct H5O_layout_t *layout,
                       size_t elmt_size, const H5S_t *file_space,
                       const H5S_number_t *numbering, size_t start,
                       size_t nelmts, const void *tconv_buf);
#endif