Emulex Logo
OneCoreā„¢ Storage SDK Release 11.2
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
spv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011-2015, Emulex
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  * this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  * this list of conditions and the following disclaimer in the documentation
13  * and/or other materials provided with the distribution.
14  *
15  * 3. Neither the name of the copyright holder nor the names of its contributors
16  * may be used to endorse or promote products derived from this software
17  * without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  *
31  */
32 
33 /**
34  * @file spv.h
35  * @brief Sparse Vector API
36  *
37  * This is a trimmed down sparse vector implementation tuned to the problem of
38  * 24-bit FC_IDs. In this case, the 24-bit index value is broken down in three
39  * 8-bit values. These values are used to index up to three 256 element arrays.
40  * Arrays are allocated, only when needed. @n @n
41  * The lookup can complete in constant time (3 indexed array references). @n @n
42  * A typical use case would be that the fabric/directory FC_IDs would cause two rows to be
43  * allocated, and the fabric assigned remote nodes would cause two rows to be allocated, with
44  * the root row always allocated. This gives five rows of 256 x sizeof(void*),
45  * resulting in 10k.
46  */
47 
48 
49 #if !defined(__SPV_H__)
50 #define __SPV_H__
51 
52 #define SPV_ROWLEN 256
53 #define SPV_DIM 3
54 
55 
56 /*!
57 * @defgroup spv Sparse Vector
58 */
59 
60 /**
61  * @brief Sparse vector structure.
62  */
63 typedef struct sparse_vector_s {
64  ocs_os_handle_t os;
65  uint32_t max_idx; /**< maximum index value */
66  void **array; /**< pointer to 3D array */
67 } *sparse_vector_t;
68 
69 extern void spv_del(sparse_vector_t spv);
70 extern sparse_vector_t spv_new(ocs_os_handle_t os);
71 extern void spv_set(sparse_vector_t sv, uint32_t idx, void *value);
72 extern void *spv_get(sparse_vector_t sv, uint32_t idx);
73 
74 #endif // __SPV_H__
void ** array
Definition: spv.h:66
ocs_os_handle_t os
Definition: spv.h:64
uint32_t max_idx
Definition: spv.h:65
void * spv_get(sparse_vector_t sv, uint32_t idx)
Return the sparse vector cell value.
Definition: spv.c:279
sparse_vector_t spv_new(ocs_os_handle_t os)
Instantiate a new sparse vector object.
Definition: spv.c:173
void spv_del(sparse_vector_t spv)
Delete a sparse vector.
Definition: spv.c:153
Sparse vector structure.
Definition: spv.h:63
void spv_set(sparse_vector_t sv, uint32_t idx, void *value)
Set the sparse vector cell value.
Definition: spv.c:258