1 //===- unittests/Lex/HeaderMapTestUtils.h - HeaderMap utils -------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===--------------------------------------------------------------===//
9 #ifndef LLVM_CLANG_UNITTESTS_LEX_HEADERMAPTESTUTILS_H
10 #define LLVM_CLANG_UNITTESTS_LEX_HEADERMAPTESTUTILS_H
12 #include "clang/Basic/CharInfo.h"
13 #include "clang/Lex/HeaderMap.h"
14 #include "clang/Lex/HeaderMapTypes.h"
15 #include "llvm/Support/SwapByteOrder.h"
21 // Lay out a header file for testing.
22 template <unsigned NumBuckets
, unsigned NumBytes
> struct HMapFileMock
{
24 HMapBucket Buckets
[NumBuckets
];
25 unsigned char Bytes
[NumBytes
];
28 memset(this, 0, sizeof(HMapFileMock
));
29 Header
.Magic
= HMAP_HeaderMagicNumber
;
30 Header
.Version
= HMAP_HeaderVersion
;
31 Header
.NumBuckets
= NumBuckets
;
32 Header
.StringsOffset
= sizeof(Header
) + sizeof(Buckets
);
36 using llvm::sys::getSwappedBytes
;
37 Header
.Magic
= getSwappedBytes(Header
.Magic
);
38 Header
.Version
= getSwappedBytes(Header
.Version
);
39 Header
.NumBuckets
= getSwappedBytes(Header
.NumBuckets
);
40 Header
.StringsOffset
= getSwappedBytes(Header
.StringsOffset
);
43 std::unique_ptr
<llvm::MemoryBuffer
> getBuffer() {
44 return llvm::MemoryBuffer::getMemBuffer(
45 StringRef(reinterpret_cast<char *>(this), sizeof(HMapFileMock
)),
47 /* RequresNullTerminator */ false);
51 template <class FileTy
> struct HMapFileMockMaker
{
55 HMapFileMockMaker(FileTy
&File
) : File(File
) {}
57 unsigned addString(StringRef S
) {
58 assert(SI
+ S
.size() + 1 <= sizeof(File
.Bytes
));
59 std::copy(S
.begin(), S
.end(), File
.Bytes
+ SI
);
65 void addBucket(StringRef Str
, unsigned Key
, unsigned Prefix
,
67 addBucket(getHash(Str
), Key
, Prefix
, Suffix
);
70 void addBucket(unsigned Hash
, unsigned Key
, unsigned Prefix
,
72 assert(!(File
.Header
.NumBuckets
& (File
.Header
.NumBuckets
- 1)));
73 unsigned I
= Hash
& (File
.Header
.NumBuckets
- 1);
75 if (!File
.Buckets
[I
].Key
) {
76 File
.Buckets
[I
].Key
= Key
;
77 File
.Buckets
[I
].Prefix
= Prefix
;
78 File
.Buckets
[I
].Suffix
= Suffix
;
79 ++File
.Header
.NumEntries
;
83 I
&= File
.Header
.NumBuckets
- 1;
84 } while (I
!= (Hash
& (File
.Header
.NumBuckets
- 1)));
85 llvm_unreachable("no empty buckets");
88 // The header map hash function.
89 static unsigned getHash(StringRef Str
) {
92 Result
+= toLowercase(C
) * 13;