FrontISTR  5.7.0
Large-scale structural analysis program with finit element method
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 
13 static const size_t nbit_ulong = 8 * sizeof(unsigned long);
14 
15 int 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 
42 void 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 
48 int 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 
71 void 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 }
hecmw_malloc.h
HECMW_bit_array_get
int HECMW_bit_array_get(struct hecmw_bit_array *ba, size_t index)
Definition: hecmw_bit_array.c:48
HECMW_bit_array_unset
void HECMW_bit_array_unset(struct hecmw_bit_array *ba, size_t index)
Definition: hecmw_bit_array.c:71
HECMW_malloc
#define HECMW_malloc(size)
Definition: hecmw_malloc.h:20
hecmw_bit_array.h
HECMW_bit_array_set_all
void HECMW_bit_array_set_all(struct hecmw_bit_array *ba)
Definition: hecmw_bit_array.c:59
HECMW_bit_array_len
size_t HECMW_bit_array_len(struct hecmw_bit_array *ba)
Definition: hecmw_bit_array.c:37
hecmw_config.h
HECMW_bit_array_init
int HECMW_bit_array_init(struct hecmw_bit_array *ba, size_t len)
Definition: hecmw_bit_array.c:15
HECMW_ERROR
#define HECMW_ERROR
Definition: hecmw_config.h:66
hecmw_bit_array::vals
unsigned long * vals
Definition: hecmw_bit_array.h:14
HECMW_bit_array_finalize
void HECMW_bit_array_finalize(struct hecmw_bit_array *ba)
Definition: hecmw_bit_array.c:31
HECMW_SUCCESS
#define HECMW_SUCCESS
Definition: hecmw_config.h:64
hecmw_bit_array::len
size_t len
Definition: hecmw_bit_array.h:13
HECMW_bit_array_set
void HECMW_bit_array_set(struct hecmw_bit_array *ba, size_t index)
Definition: hecmw_bit_array.c:42
hecmw_bit_array
Definition: hecmw_bit_array.h:9
NULL
#define NULL
Definition: hecmw_io_nastran.c:30
HECMW_free
#define HECMW_free(ptr)
Definition: hecmw_malloc.h:24
HECMW_assert
#define HECMW_assert(cond)
Definition: hecmw_util.h:40
hecmw_util.h