11
11
12
12
namespace Fortran ::runtime {
13
13
14
+ inline bool isIndirection (const RaggedArrayHeader *const header) {
15
+ return header->flags & 1 ;
16
+ }
17
+
18
+ inline std::size_t rank (const RaggedArrayHeader *const header) {
19
+ return header->flags >> 1 ;
20
+ }
21
+
14
22
RaggedArrayHeader *RaggedArrayAllocate (RaggedArrayHeader *header, bool isHeader,
15
23
std::int64_t rank, std::int64_t elementSize, std::int64_t *extentVector) {
16
24
if (header && rank) {
17
- std::int64_t size{ 1 } ;
25
+ std::int64_t size = 1 ;
18
26
for (std::int64_t counter{0 }; counter < rank; ++counter) {
19
27
size *= extentVector[counter];
20
28
if (size <= 0 ) {
21
29
return nullptr ;
22
30
}
23
31
}
24
- header->indirection = isHeader;
25
- header->rank = rank;
32
+ header->flags = (rank << 1 ) | isHeader;
26
33
header->extentPointer = extentVector;
27
34
if (isHeader) {
28
- header->bufferPointer = std::malloc ( sizeof (RaggedArrayHeader) * size) ;
35
+ header->bufferPointer = new RaggedArrayHeader[ size] ;
29
36
} else {
30
37
header->bufferPointer =
31
38
static_cast <void *>(std::calloc (elementSize, size));
@@ -39,8 +46,8 @@ RaggedArrayHeader *RaggedArrayAllocate(RaggedArrayHeader *header, bool isHeader,
39
46
// Deallocate a ragged array from the heap.
40
47
void RaggedArrayDeallocate (RaggedArrayHeader *raggedArrayHeader) {
41
48
if (raggedArrayHeader) {
42
- if (std::size_t end{raggedArrayHeader-> getRank ( )}) {
43
- if (raggedArrayHeader-> isIndirection ()) {
49
+ if (std::size_t end{rank (raggedArrayHeader )}) {
50
+ if (isIndirection (raggedArrayHeader )) {
44
51
std::size_t linearExtent{1u };
45
52
for (std::size_t counter{0u }; counter < end && linearExtent > 0 ;
46
53
++counter) {
@@ -53,8 +60,7 @@ void RaggedArrayDeallocate(RaggedArrayHeader *raggedArrayHeader) {
53
60
}
54
61
std::free (raggedArrayHeader->bufferPointer );
55
62
std::free (raggedArrayHeader->extentPointer );
56
- raggedArrayHeader->indirection = false ;
57
- raggedArrayHeader->rank = 0u ;
63
+ raggedArrayHeader->flags = 0u ;
58
64
}
59
65
}
60
66
}
0 commit comments