1 /**
2 Copyright: Copyright (c) 2017, Joakim Brännström. All rights reserved.
3 License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
4 Author: Joakim Brännström (joakim.brannstrom@gmx.com)
5 */
6 module llvm_hiwrap.type.struct_;
7 
8 import llvm_hiwrap.types;
9 
10 struct StructType {
11     import llvm;
12 
13     LxType type;
14     alias type this;
15 
16     @property const(char)[] name() {
17         import std..string : fromStringz;
18 
19         auto s = LLVMGetStructName(type);
20         return s.fromStringz;
21     }
22 
23     @property auto elements() {
24         return ElementsRange(this);
25     }
26 
27     /// Returns: Determine whether a structure is packed.
28     bool isPacked() nothrow {
29         return LLVMIsPackedStruct(type) != 0;
30     }
31 
32     /// Returns: Determine whether a structure is opaque.
33     bool isOpaque() nothrow {
34         return LLVMIsOpaqueStruct(type) != 0;
35     }
36 }
37 
38 /// The elements defined in a struct.
39 struct ElementsRange {
40     import llvm;
41 
42     StructType type;
43     alias type this;
44 
45     // The number of elements in the struct.
46     const size_t length;
47 
48     this(StructType t) nothrow {
49         auto len = LLVMCountStructElementTypes(type);
50         if (len >= size_t.max) {
51             length = size_t.max;
52             assert(0, "unreasonable parameter count (>= size_t)");
53         } else {
54             length = len;
55         }
56     }
57 
58     /// Returns: The type of the element at a given index in the structure.
59     LxType opIndex(size_t index) nothrow {
60         assert(index < length);
61         assert(index < uint.max);
62 
63         auto t = LLVMStructGetTypeAtIndex(type, cast(uint) index);
64         return LxType(t);
65     }
66 
67     import llvm_hiwrap.util : IndexedRangeX;
68 
69     mixin IndexedRangeX!LxType;
70 }