FrontISTR 5.2.0
Large-scale structural analysis program with finit element method
Loading...
Searching...
No Matches
hecmw_bit_array.c
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright (c) 2019 FrontISTR Commons
3 * This software is released under the MIT License, see LICENSE.txt
4 *****************************************************************************/
5
6#include <stdio.h>
7#include <string.h>
8#include "hecmw_util.h"
9#include "hecmw_malloc.h"
10#include "hecmw_config.h"
11#include "hecmw_bit_array.h"
12
13static const size_t nbit_ulong = 8 * sizeof(unsigned long);
14
15int HECMW_bit_array_init(struct hecmw_bit_array *ba, size_t len) {
16 size_t size;
17 HECMW_assert(ba);
18 HECMW_assert(len >= 0);
19 size = (len / nbit_ulong + 1) * sizeof(unsigned long);
20 ba->vals = (unsigned long *)HECMW_malloc(size);
21
22 if (ba->vals == NULL) {
23 return HECMW_ERROR;
24 }
25
26 memset(ba->vals, 0, size);
27 ba->len = len;
28 return HECMW_SUCCESS;
29}
30
32 HECMW_assert(ba);
33 HECMW_free(ba->vals);
34 ba->len = 0;
35}
36
38 HECMW_assert(ba);
39 return ba->len;
40}
41
42void HECMW_bit_array_set(struct hecmw_bit_array *ba, size_t index) {
43 HECMW_assert(ba);
44 HECMW_assert(0 <= index && index < ba->len);
45 ba->vals[index / nbit_ulong] |= 1UL << (index % nbit_ulong);
46}
47
48int HECMW_bit_array_get(struct hecmw_bit_array *ba, size_t index) {
49 HECMW_assert(ba);
50 HECMW_assert(0 <= index && index < ba->len);
51
52 if (ba->vals[index / nbit_ulong] & (1UL << (index % nbit_ulong)))
53 return 1;
54
55 else
56 return 0;
57}
58
60 unsigned long ptn = 0;
61 size_t i, nval;
62 HECMW_assert(ba);
63
64 for (i = 0; i < nbit_ulong; i++) ptn |= 1UL << i;
65
66 nval = ba->len / nbit_ulong + 1;
67
68 for (i = 0; i < nval; i++) ba->vals[i] = ptn;
69}
70
71void HECMW_bit_array_unset(struct hecmw_bit_array *ba, size_t index) {
72 HECMW_assert(ba);
73 HECMW_assert(0 <= index && index < ba->len);
74 ba->vals[index / nbit_ulong] &= ~(1UL << (index % nbit_ulong));
75}
size_t HECMW_bit_array_len(struct hecmw_bit_array *ba)
int HECMW_bit_array_init(struct hecmw_bit_array *ba, size_t len)
int HECMW_bit_array_get(struct hecmw_bit_array *ba, size_t index)
void HECMW_bit_array_set(struct hecmw_bit_array *ba, size_t index)
void HECMW_bit_array_unset(struct hecmw_bit_array *ba, size_t index)
void HECMW_bit_array_set_all(struct hecmw_bit_array *ba)
void HECMW_bit_array_finalize(struct hecmw_bit_array *ba)
#define HECMW_ERROR
Definition: hecmw_config.h:66
#define HECMW_SUCCESS
Definition: hecmw_config.h:64
#define NULL
#define HECMW_free(ptr)
Definition: hecmw_malloc.h:24
#define HECMW_malloc(size)
Definition: hecmw_malloc.h:20
#define HECMW_assert(cond)
Definition: hecmw_util.h:40
unsigned long * vals