asmjit 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/asmjit.gemspec +1 -1
- data/ext/asmjit/asmjit/.editorconfig +10 -0
- data/ext/asmjit/asmjit/.github/FUNDING.yml +1 -0
- data/ext/asmjit/asmjit/.github/workflows/build-config.json +47 -0
- data/ext/asmjit/asmjit/.github/workflows/build.yml +156 -0
- data/ext/asmjit/asmjit/.gitignore +6 -0
- data/ext/asmjit/asmjit/CMakeLists.txt +611 -0
- data/ext/asmjit/asmjit/LICENSE.md +17 -0
- data/ext/asmjit/asmjit/README.md +69 -0
- data/ext/asmjit/asmjit/src/asmjit/a64.h +62 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64archtraits_p.h +81 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64assembler.cpp +5115 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64assembler.h +72 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64builder.cpp +51 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64builder.h +57 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64compiler.cpp +60 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64compiler.h +247 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64emithelper.cpp +464 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64emithelper_p.h +50 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64emitter.h +1228 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64formatter.cpp +298 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64formatter_p.h +59 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64func.cpp +189 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64func_p.h +33 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64globals.h +1894 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64instapi.cpp +278 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64instapi_p.h +41 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64instdb.cpp +1957 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64instdb.h +74 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64instdb_p.h +876 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64operand.cpp +85 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64operand.h +312 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64rapass.cpp +852 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64rapass_p.h +105 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64utils.h +179 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/armformatter.cpp +143 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/armformatter_p.h +44 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/armglobals.h +21 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/armoperand.h +621 -0
- data/ext/asmjit/asmjit/src/asmjit/arm.h +62 -0
- data/ext/asmjit/asmjit/src/asmjit/asmjit-scope-begin.h +17 -0
- data/ext/asmjit/asmjit/src/asmjit/asmjit-scope-end.h +9 -0
- data/ext/asmjit/asmjit/src/asmjit/asmjit.h +33 -0
- data/ext/asmjit/asmjit/src/asmjit/core/api-build_p.h +55 -0
- data/ext/asmjit/asmjit/src/asmjit/core/api-config.h +613 -0
- data/ext/asmjit/asmjit/src/asmjit/core/archcommons.h +229 -0
- data/ext/asmjit/asmjit/src/asmjit/core/archtraits.cpp +160 -0
- data/ext/asmjit/asmjit/src/asmjit/core/archtraits.h +290 -0
- data/ext/asmjit/asmjit/src/asmjit/core/assembler.cpp +406 -0
- data/ext/asmjit/asmjit/src/asmjit/core/assembler.h +129 -0
- data/ext/asmjit/asmjit/src/asmjit/core/builder.cpp +889 -0
- data/ext/asmjit/asmjit/src/asmjit/core/builder.h +1391 -0
- data/ext/asmjit/asmjit/src/asmjit/core/codebuffer.h +113 -0
- data/ext/asmjit/asmjit/src/asmjit/core/codeholder.cpp +1149 -0
- data/ext/asmjit/asmjit/src/asmjit/core/codeholder.h +1035 -0
- data/ext/asmjit/asmjit/src/asmjit/core/codewriter.cpp +175 -0
- data/ext/asmjit/asmjit/src/asmjit/core/codewriter_p.h +179 -0
- data/ext/asmjit/asmjit/src/asmjit/core/compiler.cpp +582 -0
- data/ext/asmjit/asmjit/src/asmjit/core/compiler.h +737 -0
- data/ext/asmjit/asmjit/src/asmjit/core/compilerdefs.h +173 -0
- data/ext/asmjit/asmjit/src/asmjit/core/constpool.cpp +363 -0
- data/ext/asmjit/asmjit/src/asmjit/core/constpool.h +250 -0
- data/ext/asmjit/asmjit/src/asmjit/core/cpuinfo.cpp +1162 -0
- data/ext/asmjit/asmjit/src/asmjit/core/cpuinfo.h +813 -0
- data/ext/asmjit/asmjit/src/asmjit/core/emithelper.cpp +323 -0
- data/ext/asmjit/asmjit/src/asmjit/core/emithelper_p.h +58 -0
- data/ext/asmjit/asmjit/src/asmjit/core/emitter.cpp +333 -0
- data/ext/asmjit/asmjit/src/asmjit/core/emitter.h +741 -0
- data/ext/asmjit/asmjit/src/asmjit/core/emitterutils.cpp +129 -0
- data/ext/asmjit/asmjit/src/asmjit/core/emitterutils_p.h +89 -0
- data/ext/asmjit/asmjit/src/asmjit/core/environment.cpp +46 -0
- data/ext/asmjit/asmjit/src/asmjit/core/environment.h +508 -0
- data/ext/asmjit/asmjit/src/asmjit/core/errorhandler.cpp +14 -0
- data/ext/asmjit/asmjit/src/asmjit/core/errorhandler.h +228 -0
- data/ext/asmjit/asmjit/src/asmjit/core/formatter.cpp +584 -0
- data/ext/asmjit/asmjit/src/asmjit/core/formatter.h +247 -0
- data/ext/asmjit/asmjit/src/asmjit/core/formatter_p.h +34 -0
- data/ext/asmjit/asmjit/src/asmjit/core/func.cpp +286 -0
- data/ext/asmjit/asmjit/src/asmjit/core/func.h +1445 -0
- data/ext/asmjit/asmjit/src/asmjit/core/funcargscontext.cpp +293 -0
- data/ext/asmjit/asmjit/src/asmjit/core/funcargscontext_p.h +199 -0
- data/ext/asmjit/asmjit/src/asmjit/core/globals.cpp +133 -0
- data/ext/asmjit/asmjit/src/asmjit/core/globals.h +393 -0
- data/ext/asmjit/asmjit/src/asmjit/core/inst.cpp +113 -0
- data/ext/asmjit/asmjit/src/asmjit/core/inst.h +772 -0
- data/ext/asmjit/asmjit/src/asmjit/core/jitallocator.cpp +1242 -0
- data/ext/asmjit/asmjit/src/asmjit/core/jitallocator.h +261 -0
- data/ext/asmjit/asmjit/src/asmjit/core/jitruntime.cpp +80 -0
- data/ext/asmjit/asmjit/src/asmjit/core/jitruntime.h +89 -0
- data/ext/asmjit/asmjit/src/asmjit/core/logger.cpp +69 -0
- data/ext/asmjit/asmjit/src/asmjit/core/logger.h +198 -0
- data/ext/asmjit/asmjit/src/asmjit/core/misc_p.h +33 -0
- data/ext/asmjit/asmjit/src/asmjit/core/operand.cpp +132 -0
- data/ext/asmjit/asmjit/src/asmjit/core/operand.h +1611 -0
- data/ext/asmjit/asmjit/src/asmjit/core/osutils.cpp +84 -0
- data/ext/asmjit/asmjit/src/asmjit/core/osutils.h +61 -0
- data/ext/asmjit/asmjit/src/asmjit/core/osutils_p.h +68 -0
- data/ext/asmjit/asmjit/src/asmjit/core/raassignment_p.h +418 -0
- data/ext/asmjit/asmjit/src/asmjit/core/rabuilders_p.h +612 -0
- data/ext/asmjit/asmjit/src/asmjit/core/radefs_p.h +1204 -0
- data/ext/asmjit/asmjit/src/asmjit/core/ralocal.cpp +1166 -0
- data/ext/asmjit/asmjit/src/asmjit/core/ralocal_p.h +254 -0
- data/ext/asmjit/asmjit/src/asmjit/core/rapass.cpp +1969 -0
- data/ext/asmjit/asmjit/src/asmjit/core/rapass_p.h +1183 -0
- data/ext/asmjit/asmjit/src/asmjit/core/rastack.cpp +184 -0
- data/ext/asmjit/asmjit/src/asmjit/core/rastack_p.h +171 -0
- data/ext/asmjit/asmjit/src/asmjit/core/string.cpp +559 -0
- data/ext/asmjit/asmjit/src/asmjit/core/string.h +372 -0
- data/ext/asmjit/asmjit/src/asmjit/core/support.cpp +494 -0
- data/ext/asmjit/asmjit/src/asmjit/core/support.h +1773 -0
- data/ext/asmjit/asmjit/src/asmjit/core/target.cpp +14 -0
- data/ext/asmjit/asmjit/src/asmjit/core/target.h +53 -0
- data/ext/asmjit/asmjit/src/asmjit/core/type.cpp +74 -0
- data/ext/asmjit/asmjit/src/asmjit/core/type.h +419 -0
- data/ext/asmjit/asmjit/src/asmjit/core/virtmem.cpp +722 -0
- data/ext/asmjit/asmjit/src/asmjit/core/virtmem.h +242 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zone.cpp +353 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zone.h +615 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonehash.cpp +309 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonehash.h +186 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonelist.cpp +163 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonelist.h +209 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonestack.cpp +176 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonestack.h +239 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonestring.h +120 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonetree.cpp +99 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonetree.h +380 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonevector.cpp +356 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonevector.h +690 -0
- data/ext/asmjit/asmjit/src/asmjit/core.h +1861 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86archtraits_p.h +148 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86assembler.cpp +5110 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86assembler.h +685 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86builder.cpp +52 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86builder.h +351 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86compiler.cpp +61 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86compiler.h +721 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86emithelper.cpp +619 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86emithelper_p.h +60 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86emitter.h +4315 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86formatter.cpp +944 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86formatter_p.h +58 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86func.cpp +503 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86func_p.h +33 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86globals.h +2169 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86instapi.cpp +1732 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86instapi_p.h +41 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86instdb.cpp +4427 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86instdb.h +563 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86instdb_p.h +311 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86opcode_p.h +436 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86operand.cpp +231 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86operand.h +1085 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86rapass.cpp +1509 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86rapass_p.h +94 -0
- data/ext/asmjit/asmjit/src/asmjit/x86.h +93 -0
- data/ext/asmjit/asmjit/src/asmjit.natvis +245 -0
- data/ext/asmjit/asmjit/test/asmjit_test_assembler.cpp +84 -0
- data/ext/asmjit/asmjit/test/asmjit_test_assembler.h +85 -0
- data/ext/asmjit/asmjit/test/asmjit_test_assembler_a64.cpp +4006 -0
- data/ext/asmjit/asmjit/test/asmjit_test_assembler_x64.cpp +17833 -0
- data/ext/asmjit/asmjit/test/asmjit_test_assembler_x86.cpp +8300 -0
- data/ext/asmjit/asmjit/test/asmjit_test_compiler.cpp +253 -0
- data/ext/asmjit/asmjit/test/asmjit_test_compiler.h +73 -0
- data/ext/asmjit/asmjit/test/asmjit_test_compiler_a64.cpp +690 -0
- data/ext/asmjit/asmjit/test/asmjit_test_compiler_x86.cpp +4317 -0
- data/ext/asmjit/asmjit/test/asmjit_test_emitters.cpp +197 -0
- data/ext/asmjit/asmjit/test/asmjit_test_instinfo.cpp +181 -0
- data/ext/asmjit/asmjit/test/asmjit_test_misc.h +257 -0
- data/ext/asmjit/asmjit/test/asmjit_test_perf.cpp +62 -0
- data/ext/asmjit/asmjit/test/asmjit_test_perf.h +61 -0
- data/ext/asmjit/asmjit/test/asmjit_test_perf_a64.cpp +699 -0
- data/ext/asmjit/asmjit/test/asmjit_test_perf_x86.cpp +5032 -0
- data/ext/asmjit/asmjit/test/asmjit_test_unit.cpp +172 -0
- data/ext/asmjit/asmjit/test/asmjit_test_x86_sections.cpp +172 -0
- data/ext/asmjit/asmjit/test/asmjitutils.h +38 -0
- data/ext/asmjit/asmjit/test/broken.cpp +312 -0
- data/ext/asmjit/asmjit/test/broken.h +148 -0
- data/ext/asmjit/asmjit/test/cmdline.h +61 -0
- data/ext/asmjit/asmjit/test/performancetimer.h +41 -0
- data/ext/asmjit/asmjit/tools/configure-makefiles.sh +13 -0
- data/ext/asmjit/asmjit/tools/configure-ninja.sh +13 -0
- data/ext/asmjit/asmjit/tools/configure-sanitizers.sh +13 -0
- data/ext/asmjit/asmjit/tools/configure-vs2019-x64.bat +2 -0
- data/ext/asmjit/asmjit/tools/configure-vs2019-x86.bat +2 -0
- data/ext/asmjit/asmjit/tools/configure-vs2022-x64.bat +2 -0
- data/ext/asmjit/asmjit/tools/configure-vs2022-x86.bat +2 -0
- data/ext/asmjit/asmjit/tools/configure-xcode.sh +8 -0
- data/ext/asmjit/asmjit/tools/enumgen.js +417 -0
- data/ext/asmjit/asmjit/tools/enumgen.sh +3 -0
- data/ext/asmjit/asmjit/tools/tablegen-arm.js +365 -0
- data/ext/asmjit/asmjit/tools/tablegen-arm.sh +3 -0
- data/ext/asmjit/asmjit/tools/tablegen-x86.js +2638 -0
- data/ext/asmjit/asmjit/tools/tablegen-x86.sh +3 -0
- data/ext/asmjit/asmjit/tools/tablegen.js +947 -0
- data/ext/asmjit/asmjit/tools/tablegen.sh +4 -0
- data/ext/asmjit/asmjit.cc +18 -0
- data/lib/asmjit/version.rb +1 -1
- metadata +197 -2
@@ -0,0 +1,372 @@
|
|
1
|
+
// This file is part of AsmJit project <https://asmjit.com>
|
2
|
+
//
|
3
|
+
// See asmjit.h or LICENSE.md for license and copyright information
|
4
|
+
// SPDX-License-Identifier: Zlib
|
5
|
+
|
6
|
+
#ifndef ASMJIT_CORE_STRING_H_INCLUDED
|
7
|
+
#define ASMJIT_CORE_STRING_H_INCLUDED
|
8
|
+
|
9
|
+
#include "../core/support.h"
|
10
|
+
#include "../core/zone.h"
|
11
|
+
|
12
|
+
ASMJIT_BEGIN_NAMESPACE
|
13
|
+
|
14
|
+
//! \addtogroup asmjit_utilities
|
15
|
+
//! \{
|
16
|
+
|
17
|
+
//! Format flags used by \ref String API.
|
18
|
+
enum class StringFormatFlags : uint32_t {
|
19
|
+
//! No flags.
|
20
|
+
kNone = 0x00000000u,
|
21
|
+
//! Show sign.
|
22
|
+
kShowSign = 0x00000001u,
|
23
|
+
//! Show space.
|
24
|
+
kShowSpace = 0x00000002u,
|
25
|
+
//! Alternate form (use 0x when formatting HEX number).
|
26
|
+
kAlternate = 0x00000004u,
|
27
|
+
//! The input is signed.
|
28
|
+
kSigned = 0x80000000u
|
29
|
+
};
|
30
|
+
ASMJIT_DEFINE_ENUM_FLAGS(StringFormatFlags)
|
31
|
+
|
32
|
+
//! Fixed string - only useful for strings that would never exceed `N - 1` characters; always null-terminated.
|
33
|
+
template<size_t N>
|
34
|
+
union FixedString {
|
35
|
+
//! \name Constants
|
36
|
+
//! \{
|
37
|
+
|
38
|
+
// This cannot be constexpr as GCC 4.8 refuses constexpr members of unions.
|
39
|
+
enum : uint32_t {
|
40
|
+
kNumUInt32Words = uint32_t((N + sizeof(uint32_t) - 1) / sizeof(uint32_t))
|
41
|
+
};
|
42
|
+
|
43
|
+
//! \}
|
44
|
+
|
45
|
+
//! \name Members
|
46
|
+
//! \{
|
47
|
+
|
48
|
+
char str[kNumUInt32Words * sizeof(uint32_t)];
|
49
|
+
uint32_t u32[kNumUInt32Words];
|
50
|
+
|
51
|
+
//! \}
|
52
|
+
|
53
|
+
//! \name Utilities
|
54
|
+
//! \{
|
55
|
+
|
56
|
+
inline bool eq(const char* other) const noexcept {
|
57
|
+
return strcmp(str, other) == 0;
|
58
|
+
}
|
59
|
+
|
60
|
+
//! \}
|
61
|
+
};
|
62
|
+
|
63
|
+
//! A simple non-reference counted string that uses small string optimization (SSO).
|
64
|
+
//!
|
65
|
+
//! This string has 3 allocation possibilities:
|
66
|
+
//!
|
67
|
+
//! 1. Small - embedded buffer is used for up to `kSSOCapacity` characters. This should handle most small
|
68
|
+
//! strings and thus avoid dynamic memory allocation for most use-cases.
|
69
|
+
//!
|
70
|
+
//! 2. Large - string that doesn't fit into an embedded buffer (or string that was truncated from a larger
|
71
|
+
//! buffer) and is owned by AsmJit. When you destroy the string AsmJit would automatically
|
72
|
+
//! release the large buffer.
|
73
|
+
//!
|
74
|
+
//! 3. External - like Large (2), however, the large buffer is not owned by AsmJit and won't be released when
|
75
|
+
//! the string is destroyed or reallocated. This is mostly useful for working with larger temporary
|
76
|
+
//! strings allocated on stack or with immutable strings.
|
77
|
+
class String {
|
78
|
+
public:
|
79
|
+
ASMJIT_NONCOPYABLE(String)
|
80
|
+
|
81
|
+
//! String operation.
|
82
|
+
enum class ModifyOp : uint32_t {
|
83
|
+
//! Assignment - a new content replaces the current one.
|
84
|
+
kAssign = 0,
|
85
|
+
//! Append - a new content is appended to the string.
|
86
|
+
kAppend = 1
|
87
|
+
};
|
88
|
+
|
89
|
+
//! \cond INTERNAL
|
90
|
+
enum : uint32_t {
|
91
|
+
kLayoutSize = 32,
|
92
|
+
kSSOCapacity = kLayoutSize - 2
|
93
|
+
};
|
94
|
+
|
95
|
+
//! String type.
|
96
|
+
enum Type : uint8_t {
|
97
|
+
//! Large string (owned by String).
|
98
|
+
kTypeLarge = 0x1Fu,
|
99
|
+
//! External string (zone allocated or not owned by String).
|
100
|
+
kTypeExternal = 0x20u
|
101
|
+
};
|
102
|
+
|
103
|
+
union Raw {
|
104
|
+
uint8_t u8[kLayoutSize];
|
105
|
+
uint64_t u64[kLayoutSize / sizeof(uint64_t)];
|
106
|
+
uintptr_t uptr[kLayoutSize / sizeof(uintptr_t)];
|
107
|
+
};
|
108
|
+
|
109
|
+
struct Small {
|
110
|
+
uint8_t type;
|
111
|
+
char data[kSSOCapacity + 1u];
|
112
|
+
};
|
113
|
+
|
114
|
+
struct Large {
|
115
|
+
uint8_t type;
|
116
|
+
uint8_t reserved[sizeof(uintptr_t) - 1];
|
117
|
+
size_t size;
|
118
|
+
size_t capacity;
|
119
|
+
char* data;
|
120
|
+
};
|
121
|
+
|
122
|
+
union {
|
123
|
+
uint8_t _type;
|
124
|
+
Raw _raw;
|
125
|
+
Small _small;
|
126
|
+
Large _large;
|
127
|
+
};
|
128
|
+
//! \endcond
|
129
|
+
|
130
|
+
//! \name Construction & Destruction
|
131
|
+
//! \{
|
132
|
+
|
133
|
+
//! Creates a default-initialized string if zero length.
|
134
|
+
inline String() noexcept
|
135
|
+
: _small {} {}
|
136
|
+
|
137
|
+
//! Creates a string that takes ownership of the content of the `other` string.
|
138
|
+
inline String(String&& other) noexcept {
|
139
|
+
_raw = other._raw;
|
140
|
+
other._resetInternal();
|
141
|
+
}
|
142
|
+
|
143
|
+
inline ~String() noexcept {
|
144
|
+
reset();
|
145
|
+
}
|
146
|
+
|
147
|
+
//! Reset the string into a construction state.
|
148
|
+
ASMJIT_API Error reset() noexcept;
|
149
|
+
|
150
|
+
//! \}
|
151
|
+
|
152
|
+
//! \name Overloaded Operators
|
153
|
+
//! \{
|
154
|
+
|
155
|
+
inline String& operator=(String&& other) noexcept {
|
156
|
+
swap(other);
|
157
|
+
other.reset();
|
158
|
+
return *this;
|
159
|
+
}
|
160
|
+
|
161
|
+
inline bool operator==(const char* other) const noexcept { return eq(other); }
|
162
|
+
inline bool operator!=(const char* other) const noexcept { return !eq(other); }
|
163
|
+
|
164
|
+
inline bool operator==(const String& other) const noexcept { return eq(other); }
|
165
|
+
inline bool operator!=(const String& other) const noexcept { return !eq(other); }
|
166
|
+
|
167
|
+
//! \}
|
168
|
+
|
169
|
+
//! \name Accessors
|
170
|
+
//! \{
|
171
|
+
|
172
|
+
inline bool isExternal() const noexcept { return _type == kTypeExternal; }
|
173
|
+
inline bool isLargeOrExternal() const noexcept { return _type >= kTypeLarge; }
|
174
|
+
|
175
|
+
//! Tests whether the string is empty.
|
176
|
+
inline bool empty() const noexcept { return size() == 0; }
|
177
|
+
//! Returns the size of the string.
|
178
|
+
inline size_t size() const noexcept { return isLargeOrExternal() ? size_t(_large.size) : size_t(_type); }
|
179
|
+
//! Returns the capacity of the string.
|
180
|
+
inline size_t capacity() const noexcept { return isLargeOrExternal() ? _large.capacity : size_t(kSSOCapacity); }
|
181
|
+
|
182
|
+
//! Returns the data of the string.
|
183
|
+
inline char* data() noexcept { return isLargeOrExternal() ? _large.data : _small.data; }
|
184
|
+
//! \overload
|
185
|
+
inline const char* data() const noexcept { return isLargeOrExternal() ? _large.data : _small.data; }
|
186
|
+
|
187
|
+
inline char* start() noexcept { return data(); }
|
188
|
+
inline const char* start() const noexcept { return data(); }
|
189
|
+
|
190
|
+
inline char* end() noexcept { return data() + size(); }
|
191
|
+
inline const char* end() const noexcept { return data() + size(); }
|
192
|
+
|
193
|
+
//! \}
|
194
|
+
|
195
|
+
//! \name String Operations
|
196
|
+
//! \{
|
197
|
+
|
198
|
+
//! Swaps the content of this string with `other`.
|
199
|
+
inline void swap(String& other) noexcept {
|
200
|
+
std::swap(_raw, other._raw);
|
201
|
+
}
|
202
|
+
|
203
|
+
//! Clears the content of the string.
|
204
|
+
ASMJIT_API Error clear() noexcept;
|
205
|
+
|
206
|
+
ASMJIT_API char* prepare(ModifyOp op, size_t size) noexcept;
|
207
|
+
|
208
|
+
ASMJIT_API Error _opString(ModifyOp op, const char* str, size_t size = SIZE_MAX) noexcept;
|
209
|
+
ASMJIT_API Error _opChar(ModifyOp op, char c) noexcept;
|
210
|
+
ASMJIT_API Error _opChars(ModifyOp op, char c, size_t n) noexcept;
|
211
|
+
ASMJIT_API Error _opNumber(ModifyOp op, uint64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept;
|
212
|
+
ASMJIT_API Error _opHex(ModifyOp op, const void* data, size_t size, char separator = '\0') noexcept;
|
213
|
+
ASMJIT_API Error _opFormat(ModifyOp op, const char* fmt, ...) noexcept;
|
214
|
+
ASMJIT_API Error _opVFormat(ModifyOp op, const char* fmt, va_list ap) noexcept;
|
215
|
+
|
216
|
+
//! Replaces the current of the string with `data` of the given `size`.
|
217
|
+
//!
|
218
|
+
//! Null terminated strings can set `size` to `SIZE_MAX`.
|
219
|
+
ASMJIT_API Error assign(const char* data, size_t size = SIZE_MAX) noexcept;
|
220
|
+
|
221
|
+
//! Replaces the current of the string with `other` string.
|
222
|
+
inline Error assign(const String& other) noexcept {
|
223
|
+
return assign(other.data(), other.size());
|
224
|
+
}
|
225
|
+
|
226
|
+
//! Replaces the current of the string by a single `c` character.
|
227
|
+
inline Error assign(char c) noexcept {
|
228
|
+
return _opChar(ModifyOp::kAssign, c);
|
229
|
+
}
|
230
|
+
|
231
|
+
//! Replaces the current of the string by a `c` character, repeated `n` times.
|
232
|
+
inline Error assignChars(char c, size_t n) noexcept {
|
233
|
+
return _opChars(ModifyOp::kAssign, c, n);
|
234
|
+
}
|
235
|
+
|
236
|
+
//! Replaces the current of the string by a formatted integer `i` (signed).
|
237
|
+
inline Error assignInt(int64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept {
|
238
|
+
return _opNumber(ModifyOp::kAssign, uint64_t(i), base, width, flags | StringFormatFlags::kSigned);
|
239
|
+
}
|
240
|
+
|
241
|
+
//! Replaces the current of the string by a formatted integer `i` (unsigned).
|
242
|
+
inline Error assignUInt(uint64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept {
|
243
|
+
return _opNumber(ModifyOp::kAssign, i, base, width, flags);
|
244
|
+
}
|
245
|
+
|
246
|
+
//! Replaces the current of the string by the given `data` converted to a HEX string.
|
247
|
+
inline Error assignHex(const void* data, size_t size, char separator = '\0') noexcept {
|
248
|
+
return _opHex(ModifyOp::kAssign, data, size, separator);
|
249
|
+
}
|
250
|
+
|
251
|
+
//! Replaces the current of the string by a formatted string `fmt`.
|
252
|
+
template<typename... Args>
|
253
|
+
inline Error assignFormat(const char* fmt, Args&&... args) noexcept {
|
254
|
+
return _opFormat(ModifyOp::kAssign, fmt, std::forward<Args>(args)...);
|
255
|
+
}
|
256
|
+
|
257
|
+
//! Replaces the current of the string by a formatted string `fmt` (va_list version).
|
258
|
+
inline Error assignVFormat(const char* fmt, va_list ap) noexcept {
|
259
|
+
return _opVFormat(ModifyOp::kAssign, fmt, ap);
|
260
|
+
}
|
261
|
+
|
262
|
+
//! Appends `str` having the given size `size` to the string.
|
263
|
+
//!
|
264
|
+
//! Null terminated strings can set `size` to `SIZE_MAX`.
|
265
|
+
inline Error append(const char* str, size_t size = SIZE_MAX) noexcept {
|
266
|
+
return _opString(ModifyOp::kAppend, str, size);
|
267
|
+
}
|
268
|
+
|
269
|
+
//! Appends `other` string to this string.
|
270
|
+
inline Error append(const String& other) noexcept {
|
271
|
+
return append(other.data(), other.size());
|
272
|
+
}
|
273
|
+
|
274
|
+
//! Appends a single `c` character.
|
275
|
+
inline Error append(char c) noexcept {
|
276
|
+
return _opChar(ModifyOp::kAppend, c);
|
277
|
+
}
|
278
|
+
|
279
|
+
//! Appends `c` character repeated `n` times.
|
280
|
+
inline Error appendChars(char c, size_t n) noexcept {
|
281
|
+
return _opChars(ModifyOp::kAppend, c, n);
|
282
|
+
}
|
283
|
+
|
284
|
+
//! Appends a formatted integer `i` (signed).
|
285
|
+
inline Error appendInt(int64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept {
|
286
|
+
return _opNumber(ModifyOp::kAppend, uint64_t(i), base, width, flags | StringFormatFlags::kSigned);
|
287
|
+
}
|
288
|
+
|
289
|
+
//! Appends a formatted integer `i` (unsigned).
|
290
|
+
inline Error appendUInt(uint64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept {
|
291
|
+
return _opNumber(ModifyOp::kAppend, i, base, width, flags);
|
292
|
+
}
|
293
|
+
|
294
|
+
//! Appends the given `data` converted to a HEX string.
|
295
|
+
inline Error appendHex(const void* data, size_t size, char separator = '\0') noexcept {
|
296
|
+
return _opHex(ModifyOp::kAppend, data, size, separator);
|
297
|
+
}
|
298
|
+
|
299
|
+
//! Appends a formatted string `fmt` with `args`.
|
300
|
+
template<typename... Args>
|
301
|
+
inline Error appendFormat(const char* fmt, Args&&... args) noexcept {
|
302
|
+
return _opFormat(ModifyOp::kAppend, fmt, std::forward<Args>(args)...);
|
303
|
+
}
|
304
|
+
|
305
|
+
//! Appends a formatted string `fmt` (va_list version).
|
306
|
+
inline Error appendVFormat(const char* fmt, va_list ap) noexcept {
|
307
|
+
return _opVFormat(ModifyOp::kAppend, fmt, ap);
|
308
|
+
}
|
309
|
+
|
310
|
+
ASMJIT_API Error padEnd(size_t n, char c = ' ') noexcept;
|
311
|
+
|
312
|
+
//! Truncate the string length into `newSize`.
|
313
|
+
ASMJIT_API Error truncate(size_t newSize) noexcept;
|
314
|
+
|
315
|
+
ASMJIT_API bool eq(const char* other, size_t size = SIZE_MAX) const noexcept;
|
316
|
+
inline bool eq(const String& other) const noexcept { return eq(other.data(), other.size()); }
|
317
|
+
|
318
|
+
//! \}
|
319
|
+
|
320
|
+
//! \name Internal Functions
|
321
|
+
//! \{
|
322
|
+
|
323
|
+
//! Resets string to embedded and makes it empty (zero length, zero first char)
|
324
|
+
//!
|
325
|
+
//! \note This is always called internally after an external buffer was released as it zeroes all bytes
|
326
|
+
//! used by String's embedded storage.
|
327
|
+
inline void _resetInternal() noexcept {
|
328
|
+
for (size_t i = 0; i < ASMJIT_ARRAY_SIZE(_raw.uptr); i++)
|
329
|
+
_raw.uptr[i] = 0;
|
330
|
+
}
|
331
|
+
|
332
|
+
inline void _setSize(size_t newSize) noexcept {
|
333
|
+
if (isLargeOrExternal())
|
334
|
+
_large.size = newSize;
|
335
|
+
else
|
336
|
+
_small.type = uint8_t(newSize);
|
337
|
+
}
|
338
|
+
|
339
|
+
//! \}
|
340
|
+
};
|
341
|
+
|
342
|
+
//! Temporary string builder, has statically allocated `N` bytes.
|
343
|
+
template<size_t N>
|
344
|
+
class StringTmp : public String {
|
345
|
+
public:
|
346
|
+
ASMJIT_NONCOPYABLE(StringTmp)
|
347
|
+
|
348
|
+
//! Embedded data.
|
349
|
+
char _embeddedData[Support::alignUp(N + 1, sizeof(size_t))];
|
350
|
+
|
351
|
+
//! \name Construction & Destruction
|
352
|
+
//! \{
|
353
|
+
|
354
|
+
inline StringTmp() noexcept {
|
355
|
+
_resetToTemporary();
|
356
|
+
}
|
357
|
+
|
358
|
+
inline void _resetToTemporary() noexcept {
|
359
|
+
_large.type = kTypeExternal;
|
360
|
+
_large.capacity = ASMJIT_ARRAY_SIZE(_embeddedData) - 1;
|
361
|
+
_large.data = _embeddedData;
|
362
|
+
_embeddedData[0] = '\0';
|
363
|
+
}
|
364
|
+
|
365
|
+
//! \}
|
366
|
+
};
|
367
|
+
|
368
|
+
//! \}
|
369
|
+
|
370
|
+
ASMJIT_END_NAMESPACE
|
371
|
+
|
372
|
+
#endif // ASMJIT_CORE_STRING_H_INCLUDED
|