Thanks for using Compiler Explorer
Sponsors
Jakt
C++
Ada
Analysis
Android Java
Android Kotlin
Assembly
C
C3
Carbon
C++ (Circle)
CIRCT
Clean
CMake
CMakeScript
COBOL
C++ for OpenCL
MLIR
Cppx
Cppx-Blue
Cppx-Gold
Cpp2-cppfront
Crystal
C#
CUDA C++
D
Dart
Elixir
Erlang
Fortran
F#
GLSL
Go
Haskell
HLSL
Hook
Hylo
IL
ispc
Java
Julia
Kotlin
LLVM IR
LLVM MIR
Modula-2
Nim
Objective-C
Objective-C++
OCaml
Odin
OpenCL C
Pascal
Pony
Python
Racket
Ruby
Rust
Snowball
Scala
Slang
Solidity
Spice
SPIR-V
Swift
LLVM TableGen
Toit
TypeScript Native
V
Vala
Visual Basic
Vyper
WASM
Zig
Javascript
GIMPLE
Ygen
c++ source #1
Output
Compile to binary object
Link to binary
Execute the code
Intel asm syntax
Demangle identifiers
Verbose demangling
Filters
Unused labels
Library functions
Directives
Comments
Horizontal whitespace
Debug intrinsics
Compiler
6502-c++ 11.1.0
ARM GCC 10.2.0
ARM GCC 10.3.0
ARM GCC 10.4.0
ARM GCC 10.5.0
ARM GCC 11.1.0
ARM GCC 11.2.0
ARM GCC 11.3.0
ARM GCC 11.4.0
ARM GCC 12.1.0
ARM GCC 12.2.0
ARM GCC 12.3.0
ARM GCC 12.4.0
ARM GCC 13.1.0
ARM GCC 13.2.0
ARM GCC 13.2.0 (unknown-eabi)
ARM GCC 13.3.0
ARM GCC 13.3.0 (unknown-eabi)
ARM GCC 14.1.0
ARM GCC 14.1.0 (unknown-eabi)
ARM GCC 14.2.0
ARM GCC 14.2.0 (unknown-eabi)
ARM GCC 4.5.4
ARM GCC 4.6.4
ARM GCC 5.4
ARM GCC 6.3.0
ARM GCC 6.4.0
ARM GCC 7.3.0
ARM GCC 7.5.0
ARM GCC 8.2.0
ARM GCC 8.5.0
ARM GCC 9.3.0
ARM GCC 9.4.0
ARM GCC 9.5.0
ARM GCC trunk
ARM gcc 10.2.1 (none)
ARM gcc 10.3.1 (2021.07 none)
ARM gcc 10.3.1 (2021.10 none)
ARM gcc 11.2.1 (none)
ARM gcc 5.4.1 (none)
ARM gcc 7.2.1 (none)
ARM gcc 8.2 (WinCE)
ARM gcc 8.3.1 (none)
ARM gcc 9.2.1 (none)
ARM msvc v19.0 (WINE)
ARM msvc v19.10 (WINE)
ARM msvc v19.14 (WINE)
ARM64 Morello gcc 10.1 Alpha 2
ARM64 gcc 10.2
ARM64 gcc 10.3
ARM64 gcc 10.4
ARM64 gcc 10.5.0
ARM64 gcc 11.1
ARM64 gcc 11.2
ARM64 gcc 11.3
ARM64 gcc 11.4.0
ARM64 gcc 12.1
ARM64 gcc 12.2.0
ARM64 gcc 12.3.0
ARM64 gcc 12.4.0
ARM64 gcc 13.1.0
ARM64 gcc 13.2.0
ARM64 gcc 13.3.0
ARM64 gcc 14.1.0
ARM64 gcc 14.2.0
ARM64 gcc 4.9.4
ARM64 gcc 5.4
ARM64 gcc 5.5.0
ARM64 gcc 6.3
ARM64 gcc 6.4
ARM64 gcc 7.3
ARM64 gcc 7.5
ARM64 gcc 8.2
ARM64 gcc 8.5
ARM64 gcc 9.3
ARM64 gcc 9.4
ARM64 gcc 9.5
ARM64 gcc trunk
ARM64 msvc v19.14 (WINE)
AVR gcc 10.3.0
AVR gcc 11.1.0
AVR gcc 12.1.0
AVR gcc 12.2.0
AVR gcc 12.3.0
AVR gcc 12.4.0
AVR gcc 13.1.0
AVR gcc 13.2.0
AVR gcc 13.3.0
AVR gcc 14.1.0
AVR gcc 14.2.0
AVR gcc 4.5.4
AVR gcc 4.6.4
AVR gcc 5.4.0
AVR gcc 9.2.0
AVR gcc 9.3.0
Arduino Mega (1.8.9)
Arduino Uno (1.8.9)
BPF clang (trunk)
BPF clang 13.0.0
BPF clang 14.0.0
BPF clang 15.0.0
BPF clang 16.0.0
BPF clang 17.0.1
BPF clang 18.1.0
BPF clang 19.1.0
EDG (experimental reflection)
EDG 6.5
EDG 6.5 (GNU mode gcc 13)
EDG 6.6
EDG 6.6 (GNU mode gcc 13)
FRC 2019
FRC 2020
FRC 2023
HPPA gcc 14.2.0
KVX ACB 4.1.0 (GCC 7.5.0)
KVX ACB 4.1.0-cd1 (GCC 7.5.0)
KVX ACB 4.10.0 (GCC 10.3.1)
KVX ACB 4.11.1 (GCC 10.3.1)
KVX ACB 4.12.0 (GCC 11.3.0)
KVX ACB 4.2.0 (GCC 7.5.0)
KVX ACB 4.3.0 (GCC 7.5.0)
KVX ACB 4.4.0 (GCC 7.5.0)
KVX ACB 4.6.0 (GCC 9.4.1)
KVX ACB 4.8.0 (GCC 9.4.1)
KVX ACB 4.9.0 (GCC 9.4.1)
KVX ACB 5.0.0 (GCC 12.2.1)
KVX ACB 5.2.0 (GCC 13.2.1)
LoongArch64 clang (trunk)
LoongArch64 clang 17.0.1
LoongArch64 clang 18.1.0
LoongArch64 clang 19.1.0
M68K gcc 13.1.0
M68K gcc 13.2.0
M68K gcc 13.3.0
M68K gcc 14.1.0
M68K gcc 14.2.0
M68k clang (trunk)
MRISC32 gcc (trunk)
MSP430 gcc 4.5.3
MSP430 gcc 5.3.0
MSP430 gcc 6.2.1
MinGW clang 14.0.3
MinGW clang 14.0.6
MinGW clang 15.0.7
MinGW clang 16.0.0
MinGW clang 16.0.2
MinGW gcc 11.3.0
MinGW gcc 12.1.0
MinGW gcc 12.2.0
MinGW gcc 13.1.0
RISC-V (32-bits) gcc (trunk)
RISC-V (32-bits) gcc 10.2.0
RISC-V (32-bits) gcc 10.3.0
RISC-V (32-bits) gcc 11.2.0
RISC-V (32-bits) gcc 11.3.0
RISC-V (32-bits) gcc 11.4.0
RISC-V (32-bits) gcc 12.1.0
RISC-V (32-bits) gcc 12.2.0
RISC-V (32-bits) gcc 12.3.0
RISC-V (32-bits) gcc 12.4.0
RISC-V (32-bits) gcc 13.1.0
RISC-V (32-bits) gcc 13.2.0
RISC-V (32-bits) gcc 13.3.0
RISC-V (32-bits) gcc 14.1.0
RISC-V (32-bits) gcc 14.2.0
RISC-V (32-bits) gcc 8.2.0
RISC-V (32-bits) gcc 8.5.0
RISC-V (32-bits) gcc 9.4.0
RISC-V (64-bits) gcc (trunk)
RISC-V (64-bits) gcc 10.2.0
RISC-V (64-bits) gcc 10.3.0
RISC-V (64-bits) gcc 11.2.0
RISC-V (64-bits) gcc 11.3.0
RISC-V (64-bits) gcc 11.4.0
RISC-V (64-bits) gcc 12.1.0
RISC-V (64-bits) gcc 12.2.0
RISC-V (64-bits) gcc 12.3.0
RISC-V (64-bits) gcc 12.4.0
RISC-V (64-bits) gcc 13.1.0
RISC-V (64-bits) gcc 13.2.0
RISC-V (64-bits) gcc 13.3.0
RISC-V (64-bits) gcc 14.1.0
RISC-V (64-bits) gcc 14.2.0
RISC-V (64-bits) gcc 8.2.0
RISC-V (64-bits) gcc 8.5.0
RISC-V (64-bits) gcc 9.4.0
RISC-V rv32gc clang (trunk)
RISC-V rv32gc clang 10.0.0
RISC-V rv32gc clang 10.0.1
RISC-V rv32gc clang 11.0.0
RISC-V rv32gc clang 11.0.1
RISC-V rv32gc clang 12.0.0
RISC-V rv32gc clang 12.0.1
RISC-V rv32gc clang 13.0.0
RISC-V rv32gc clang 13.0.1
RISC-V rv32gc clang 14.0.0
RISC-V rv32gc clang 15.0.0
RISC-V rv32gc clang 16.0.0
RISC-V rv32gc clang 17.0.1
RISC-V rv32gc clang 18.1.0
RISC-V rv32gc clang 19.1.0
RISC-V rv32gc clang 9.0.0
RISC-V rv32gc clang 9.0.1
RISC-V rv64gc clang (trunk)
RISC-V rv64gc clang 10.0.0
RISC-V rv64gc clang 10.0.1
RISC-V rv64gc clang 11.0.0
RISC-V rv64gc clang 11.0.1
RISC-V rv64gc clang 12.0.0
RISC-V rv64gc clang 12.0.1
RISC-V rv64gc clang 13.0.0
RISC-V rv64gc clang 13.0.1
RISC-V rv64gc clang 14.0.0
RISC-V rv64gc clang 15.0.0
RISC-V rv64gc clang 16.0.0
RISC-V rv64gc clang 17.0.1
RISC-V rv64gc clang 18.1.0
RISC-V rv64gc clang 19.1.0
RISC-V rv64gc clang 9.0.0
RISC-V rv64gc clang 9.0.1
Raspbian Buster
Raspbian Stretch
SPARC LEON gcc 12.2.0
SPARC LEON gcc 12.3.0
SPARC LEON gcc 12.4.0
SPARC LEON gcc 13.1.0
SPARC LEON gcc 13.2.0
SPARC LEON gcc 13.3.0
SPARC LEON gcc 14.1.0
SPARC LEON gcc 14.2.0
SPARC gcc 12.2.0
SPARC gcc 12.3.0
SPARC gcc 12.4.0
SPARC gcc 13.1.0
SPARC gcc 13.2.0
SPARC gcc 13.3.0
SPARC gcc 14.1.0
SPARC gcc 14.2.0
SPARC64 gcc 12.2.0
SPARC64 gcc 12.3.0
SPARC64 gcc 12.4.0
SPARC64 gcc 13.1.0
SPARC64 gcc 13.2.0
SPARC64 gcc 13.3.0
SPARC64 gcc 14.1.0
SPARC64 gcc 14.2.0
TI C6x gcc 12.2.0
TI C6x gcc 12.3.0
TI C6x gcc 12.4.0
TI C6x gcc 13.1.0
TI C6x gcc 13.2.0
TI C6x gcc 13.3.0
TI C6x gcc 14.1.0
TI C6x gcc 14.2.0
TI CL430 21.6.1
VAX gcc NetBSDELF 10.4.0
VAX gcc NetBSDELF 10.5.0 (Nov 15 03:50:22 2023)
WebAssembly clang (trunk)
Xtensa ESP32 gcc 11.2.0 (2022r1)
Xtensa ESP32 gcc 12.2.0 (20230208)
Xtensa ESP32 gcc 8.2.0 (2019r2)
Xtensa ESP32 gcc 8.2.0 (2020r1)
Xtensa ESP32 gcc 8.2.0 (2020r2)
Xtensa ESP32 gcc 8.4.0 (2020r3)
Xtensa ESP32 gcc 8.4.0 (2021r1)
Xtensa ESP32 gcc 8.4.0 (2021r2)
Xtensa ESP32-S2 gcc 11.2.0 (2022r1)
Xtensa ESP32-S2 gcc 12.2.0 (20230208)
Xtensa ESP32-S2 gcc 8.2.0 (2019r2)
Xtensa ESP32-S2 gcc 8.2.0 (2020r1)
Xtensa ESP32-S2 gcc 8.2.0 (2020r2)
Xtensa ESP32-S2 gcc 8.4.0 (2020r3)
Xtensa ESP32-S2 gcc 8.4.0 (2021r1)
Xtensa ESP32-S2 gcc 8.4.0 (2021r2)
Xtensa ESP32-S3 gcc 11.2.0 (2022r1)
Xtensa ESP32-S3 gcc 12.2.0 (20230208)
Xtensa ESP32-S3 gcc 8.4.0 (2020r3)
Xtensa ESP32-S3 gcc 8.4.0 (2021r1)
Xtensa ESP32-S3 gcc 8.4.0 (2021r2)
arm64 msvc v19.20 VS16.0
arm64 msvc v19.21 VS16.1
arm64 msvc v19.22 VS16.2
arm64 msvc v19.23 VS16.3
arm64 msvc v19.24 VS16.4
arm64 msvc v19.25 VS16.5
arm64 msvc v19.27 VS16.7
arm64 msvc v19.28 VS16.8
arm64 msvc v19.28 VS16.9
arm64 msvc v19.29 VS16.10
arm64 msvc v19.29 VS16.11
arm64 msvc v19.30 VS17.0
arm64 msvc v19.31 VS17.1
arm64 msvc v19.32 VS17.2
arm64 msvc v19.33 VS17.3
arm64 msvc v19.34 VS17.4
arm64 msvc v19.35 VS17.5
arm64 msvc v19.36 VS17.6
arm64 msvc v19.37 VS17.7
arm64 msvc v19.38 VS17.8
arm64 msvc v19.39 VS17.9
arm64 msvc v19.40 VS17.10
arm64 msvc v19.latest
armv7-a clang (trunk)
armv7-a clang 10.0.0
armv7-a clang 10.0.1
armv7-a clang 11.0.0
armv7-a clang 11.0.1
armv7-a clang 12.0.0
armv7-a clang 12.0.1
armv7-a clang 13.0.0
armv7-a clang 13.0.1
armv7-a clang 14.0.0
armv7-a clang 15.0.0
armv7-a clang 16.0.0
armv7-a clang 17.0.1
armv7-a clang 18.1.0
armv7-a clang 19.1.0
armv7-a clang 9.0.0
armv7-a clang 9.0.1
armv8-a clang (all architectural features, trunk)
armv8-a clang (trunk)
armv8-a clang 10.0.0
armv8-a clang 10.0.1
armv8-a clang 11.0.0
armv8-a clang 11.0.1
armv8-a clang 12.0.0
armv8-a clang 13.0.0
armv8-a clang 14.0.0
armv8-a clang 15.0.0
armv8-a clang 16.0.0
armv8-a clang 17.0.1
armv8-a clang 18.1.0
armv8-a clang 19.1.0
armv8-a clang 9.0.0
armv8-a clang 9.0.1
clang-cl 18.1.0
ellcc 0.1.33
ellcc 0.1.34
ellcc 2017-07-16
hexagon-clang 16.0.5
llvm-mos atari2600-3e
llvm-mos atari2600-4k
llvm-mos atari2600-common
llvm-mos atari5200-supercart
llvm-mos atari8-cart-megacart
llvm-mos atari8-cart-std
llvm-mos atari8-cart-xegs
llvm-mos atari8-common
llvm-mos atari8-dos
llvm-mos c128
llvm-mos c64
llvm-mos commodore
llvm-mos cpm65
llvm-mos cx16
llvm-mos dodo
llvm-mos eater
llvm-mos mega65
llvm-mos nes
llvm-mos nes-action53
llvm-mos nes-cnrom
llvm-mos nes-gtrom
llvm-mos nes-mmc1
llvm-mos nes-mmc3
llvm-mos nes-nrom
llvm-mos nes-unrom
llvm-mos nes-unrom-512
llvm-mos osi-c1p
llvm-mos pce
llvm-mos pce-cd
llvm-mos pce-common
llvm-mos pet
llvm-mos rp6502
llvm-mos rpc8e
llvm-mos supervision
llvm-mos vic20
loongarch64 gcc 12.2.0
loongarch64 gcc 12.3.0
loongarch64 gcc 12.4.0
loongarch64 gcc 13.1.0
loongarch64 gcc 13.2.0
loongarch64 gcc 13.3.0
loongarch64 gcc 14.1.0
loongarch64 gcc 14.2.0
mips clang 13.0.0
mips clang 14.0.0
mips clang 15.0.0
mips clang 16.0.0
mips clang 17.0.1
mips clang 18.1.0
mips clang 19.1.0
mips gcc 11.2.0
mips gcc 12.1.0
mips gcc 12.2.0
mips gcc 12.3.0
mips gcc 12.4.0
mips gcc 13.1.0
mips gcc 13.2.0
mips gcc 13.3.0
mips gcc 14.1.0
mips gcc 14.2.0
mips gcc 4.9.4
mips gcc 5.4
mips gcc 5.5.0
mips gcc 9.3.0 (codescape)
mips gcc 9.5.0
mips64 (el) gcc 12.1.0
mips64 (el) gcc 12.2.0
mips64 (el) gcc 12.3.0
mips64 (el) gcc 12.4.0
mips64 (el) gcc 13.1.0
mips64 (el) gcc 13.2.0
mips64 (el) gcc 13.3.0
mips64 (el) gcc 14.1.0
mips64 (el) gcc 14.2.0
mips64 (el) gcc 4.9.4
mips64 (el) gcc 5.4.0
mips64 (el) gcc 5.5.0
mips64 (el) gcc 9.5.0
mips64 clang 13.0.0
mips64 clang 14.0.0
mips64 clang 15.0.0
mips64 clang 16.0.0
mips64 clang 17.0.1
mips64 clang 18.1.0
mips64 clang 19.1.0
mips64 gcc 11.2.0
mips64 gcc 12.1.0
mips64 gcc 12.2.0
mips64 gcc 12.3.0
mips64 gcc 12.4.0
mips64 gcc 13.1.0
mips64 gcc 13.2.0
mips64 gcc 13.3.0
mips64 gcc 14.1.0
mips64 gcc 14.2.0
mips64 gcc 4.9.4
mips64 gcc 5.4.0
mips64 gcc 5.5.0
mips64 gcc 9.5.0
mips64el clang 13.0.0
mips64el clang 14.0.0
mips64el clang 15.0.0
mips64el clang 16.0.0
mips64el clang 17.0.1
mips64el clang 18.1.0
mips64el clang 19.1.0
mipsel clang 13.0.0
mipsel clang 14.0.0
mipsel clang 15.0.0
mipsel clang 16.0.0
mipsel clang 17.0.1
mipsel clang 18.1.0
mipsel clang 19.1.0
mipsel gcc 12.1.0
mipsel gcc 12.2.0
mipsel gcc 12.3.0
mipsel gcc 12.4.0
mipsel gcc 13.1.0
mipsel gcc 13.2.0
mipsel gcc 13.3.0
mipsel gcc 14.1.0
mipsel gcc 14.2.0
mipsel gcc 4.9.4
mipsel gcc 5.4.0
mipsel gcc 5.5.0
mipsel gcc 9.5.0
nanoMIPS gcc 6.3.0 (mtk)
power gcc 11.2.0
power gcc 12.1.0
power gcc 12.2.0
power gcc 12.3.0
power gcc 12.4.0
power gcc 13.1.0
power gcc 13.2.0
power gcc 13.3.0
power gcc 14.1.0
power gcc 14.2.0
power gcc 4.8.5
power64 AT12.0 (gcc8)
power64 AT13.0 (gcc9)
power64 gcc 11.2.0
power64 gcc 12.1.0
power64 gcc 12.2.0
power64 gcc 12.3.0
power64 gcc 12.4.0
power64 gcc 13.1.0
power64 gcc 13.2.0
power64 gcc 13.3.0
power64 gcc 14.1.0
power64 gcc 14.2.0
power64 gcc trunk
power64le AT12.0 (gcc8)
power64le AT13.0 (gcc9)
power64le clang (trunk)
power64le gcc 11.2.0
power64le gcc 12.1.0
power64le gcc 12.2.0
power64le gcc 12.3.0
power64le gcc 12.4.0
power64le gcc 13.1.0
power64le gcc 13.2.0
power64le gcc 13.3.0
power64le gcc 14.1.0
power64le gcc 14.2.0
power64le gcc 6.3.0
power64le gcc trunk
powerpc64 clang (trunk)
s390x gcc 11.2.0
s390x gcc 12.1.0
s390x gcc 12.2.0
s390x gcc 12.3.0
s390x gcc 12.4.0
s390x gcc 13.1.0
s390x gcc 13.2.0
s390x gcc 13.3.0
s390x gcc 14.1.0
s390x gcc 14.2.0
sh gcc 12.2.0
sh gcc 12.3.0
sh gcc 12.4.0
sh gcc 13.1.0
sh gcc 13.2.0
sh gcc 13.3.0
sh gcc 14.1.0
sh gcc 14.2.0
sh gcc 4.9.4
sh gcc 9.5.0
vast (trunk)
x64 msvc v19.0 (WINE)
x64 msvc v19.10 (WINE)
x64 msvc v19.14 (WINE)
x64 msvc v19.20 VS16.0
x64 msvc v19.21 VS16.1
x64 msvc v19.22 VS16.2
x64 msvc v19.23 VS16.3
x64 msvc v19.24 VS16.4
x64 msvc v19.25 VS16.5
x64 msvc v19.27 VS16.7
x64 msvc v19.28 VS16.8
x64 msvc v19.28 VS16.9
x64 msvc v19.29 VS16.10
x64 msvc v19.29 VS16.11
x64 msvc v19.30 VS17.0
x64 msvc v19.31 VS17.1
x64 msvc v19.32 VS17.2
x64 msvc v19.33 VS17.3
x64 msvc v19.34 VS17.4
x64 msvc v19.35 VS17.5
x64 msvc v19.36 VS17.6
x64 msvc v19.37 VS17.7
x64 msvc v19.38 VS17.8
x64 msvc v19.39 VS17.9
x64 msvc v19.40 VS17.10
x64 msvc v19.latest
x86 djgpp 4.9.4
x86 djgpp 5.5.0
x86 djgpp 6.4.0
x86 djgpp 7.2.0
x86 msvc v19.0 (WINE)
x86 msvc v19.10 (WINE)
x86 msvc v19.14 (WINE)
x86 msvc v19.20 VS16.0
x86 msvc v19.21 VS16.1
x86 msvc v19.22 VS16.2
x86 msvc v19.23 VS16.3
x86 msvc v19.24 VS16.4
x86 msvc v19.25 VS16.5
x86 msvc v19.27 VS16.7
x86 msvc v19.28 VS16.8
x86 msvc v19.28 VS16.9
x86 msvc v19.29 VS16.10
x86 msvc v19.29 VS16.11
x86 msvc v19.30 VS17.0
x86 msvc v19.31 VS17.1
x86 msvc v19.32 VS17.2
x86 msvc v19.33 VS17.3
x86 msvc v19.34 VS17.4
x86 msvc v19.35 VS17.5
x86 msvc v19.36 VS17.6
x86 msvc v19.37 VS17.7
x86 msvc v19.38 VS17.8
x86 msvc v19.39 VS17.9
x86 msvc v19.40 VS17.10
x86 msvc v19.latest
x86 nvc++ 22.11
x86 nvc++ 22.7
x86 nvc++ 22.9
x86 nvc++ 23.1
x86 nvc++ 23.11
x86 nvc++ 23.3
x86 nvc++ 23.5
x86 nvc++ 23.7
x86 nvc++ 23.9
x86 nvc++ 24.1
x86 nvc++ 24.11
x86 nvc++ 24.3
x86 nvc++ 24.5
x86 nvc++ 24.7
x86 nvc++ 24.9
x86-64 Zapcc 190308
x86-64 clang (EricWF contracts)
x86-64 clang (amd-staging)
x86-64 clang (assertions trunk)
x86-64 clang (clangir)
x86-64 clang (dascandy contracts)
x86-64 clang (experimental -Wlifetime)
x86-64 clang (experimental P1061)
x86-64 clang (experimental P1144)
x86-64 clang (experimental P1221)
x86-64 clang (experimental P2996)
x86-64 clang (experimental P2998)
x86-64 clang (experimental P3068)
x86-64 clang (experimental P3309)
x86-64 clang (experimental P3367)
x86-64 clang (experimental P3372)
x86-64 clang (experimental metaprogramming - P2632)
x86-64 clang (old concepts branch)
x86-64 clang (p1974)
x86-64 clang (pattern matching - P2688)
x86-64 clang (reflection)
x86-64 clang (resugar)
x86-64 clang (string interpolation - P3412)
x86-64 clang (thephd.dev)
x86-64 clang (trunk)
x86-64 clang (variadic friends - P2893)
x86-64 clang (widberg)
x86-64 clang 10.0.0
x86-64 clang 10.0.0 (assertions)
x86-64 clang 10.0.1
x86-64 clang 11.0.0
x86-64 clang 11.0.0 (assertions)
x86-64 clang 11.0.1
x86-64 clang 12.0.0
x86-64 clang 12.0.0 (assertions)
x86-64 clang 12.0.1
x86-64 clang 13.0.0
x86-64 clang 13.0.0 (assertions)
x86-64 clang 13.0.1
x86-64 clang 14.0.0
x86-64 clang 14.0.0 (assertions)
x86-64 clang 15.0.0
x86-64 clang 15.0.0 (assertions)
x86-64 clang 16.0.0
x86-64 clang 16.0.0 (assertions)
x86-64 clang 17.0.1
x86-64 clang 17.0.1 (assertions)
x86-64 clang 18.1.0
x86-64 clang 18.1.0 (assertions)
x86-64 clang 19.1.0
x86-64 clang 19.1.0 (assertions)
x86-64 clang 2.6.0 (assertions)
x86-64 clang 2.7.0 (assertions)
x86-64 clang 2.8.0 (assertions)
x86-64 clang 2.9.0 (assertions)
x86-64 clang 3.0.0
x86-64 clang 3.0.0 (assertions)
x86-64 clang 3.1
x86-64 clang 3.1 (assertions)
x86-64 clang 3.2
x86-64 clang 3.2 (assertions)
x86-64 clang 3.3
x86-64 clang 3.3 (assertions)
x86-64 clang 3.4 (assertions)
x86-64 clang 3.4.1
x86-64 clang 3.5
x86-64 clang 3.5 (assertions)
x86-64 clang 3.5.1
x86-64 clang 3.5.2
x86-64 clang 3.6
x86-64 clang 3.6 (assertions)
x86-64 clang 3.7
x86-64 clang 3.7 (assertions)
x86-64 clang 3.7.1
x86-64 clang 3.8
x86-64 clang 3.8 (assertions)
x86-64 clang 3.8.1
x86-64 clang 3.9.0
x86-64 clang 3.9.0 (assertions)
x86-64 clang 3.9.1
x86-64 clang 4.0.0
x86-64 clang 4.0.0 (assertions)
x86-64 clang 4.0.1
x86-64 clang 5.0.0
x86-64 clang 5.0.0 (assertions)
x86-64 clang 5.0.1
x86-64 clang 5.0.2
x86-64 clang 6.0.0
x86-64 clang 6.0.0 (assertions)
x86-64 clang 6.0.1
x86-64 clang 7.0.0
x86-64 clang 7.0.0 (assertions)
x86-64 clang 7.0.1
x86-64 clang 7.1.0
x86-64 clang 8.0.0
x86-64 clang 8.0.0 (assertions)
x86-64 clang 8.0.1
x86-64 clang 9.0.0
x86-64 clang 9.0.0 (assertions)
x86-64 clang 9.0.1
x86-64 clang rocm-4.5.2
x86-64 clang rocm-5.0.2
x86-64 clang rocm-5.1.3
x86-64 clang rocm-5.2.3
x86-64 clang rocm-5.3.3
x86-64 clang rocm-5.7.0
x86-64 clang rocm-6.0.2
x86-64 clang rocm-6.1.2
x86-64 gcc (contract labels)
x86-64 gcc (contracts natural syntax)
x86-64 gcc (contracts)
x86-64 gcc (coroutines)
x86-64 gcc (modules)
x86-64 gcc (trunk)
x86-64 gcc 10.1
x86-64 gcc 10.2
x86-64 gcc 10.3
x86-64 gcc 10.4
x86-64 gcc 10.5
x86-64 gcc 11.1
x86-64 gcc 11.2
x86-64 gcc 11.3
x86-64 gcc 11.4
x86-64 gcc 12.1
x86-64 gcc 12.2
x86-64 gcc 12.3
x86-64 gcc 12.4
x86-64 gcc 13.1
x86-64 gcc 13.2
x86-64 gcc 13.3
x86-64 gcc 14.1
x86-64 gcc 14.2
x86-64 gcc 3.4.6
x86-64 gcc 4.0.4
x86-64 gcc 4.1.2
x86-64 gcc 4.4.7
x86-64 gcc 4.5.3
x86-64 gcc 4.6.4
x86-64 gcc 4.7.1
x86-64 gcc 4.7.2
x86-64 gcc 4.7.3
x86-64 gcc 4.7.4
x86-64 gcc 4.8.1
x86-64 gcc 4.8.2
x86-64 gcc 4.8.3
x86-64 gcc 4.8.4
x86-64 gcc 4.8.5
x86-64 gcc 4.9.0
x86-64 gcc 4.9.1
x86-64 gcc 4.9.2
x86-64 gcc 4.9.3
x86-64 gcc 4.9.4
x86-64 gcc 5.1
x86-64 gcc 5.2
x86-64 gcc 5.3
x86-64 gcc 5.4
x86-64 gcc 5.5
x86-64 gcc 6.1
x86-64 gcc 6.2
x86-64 gcc 6.3
x86-64 gcc 6.4
x86-64 gcc 6.5
x86-64 gcc 7.1
x86-64 gcc 7.2
x86-64 gcc 7.3
x86-64 gcc 7.4
x86-64 gcc 7.5
x86-64 gcc 8.1
x86-64 gcc 8.2
x86-64 gcc 8.3
x86-64 gcc 8.4
x86-64 gcc 8.5
x86-64 gcc 9.1
x86-64 gcc 9.2
x86-64 gcc 9.3
x86-64 gcc 9.4
x86-64 gcc 9.5
x86-64 icc 13.0.1
x86-64 icc 16.0.3
x86-64 icc 17.0.0
x86-64 icc 18.0.0
x86-64 icc 19.0.0
x86-64 icc 19.0.1
x86-64 icc 2021.1.2
x86-64 icc 2021.10.0
x86-64 icc 2021.2.0
x86-64 icc 2021.3.0
x86-64 icc 2021.4.0
x86-64 icc 2021.5.0
x86-64 icc 2021.6.0
x86-64 icc 2021.7.0
x86-64 icc 2021.7.1
x86-64 icc 2021.8.0
x86-64 icc 2021.9.0
x86-64 icx 2021.1.2
x86-64 icx 2021.2.0
x86-64 icx 2021.3.0
x86-64 icx 2021.4.0
x86-64 icx 2022.0.0
x86-64 icx 2022.1.0
x86-64 icx 2022.2.0
x86-64 icx 2022.2.1
x86-64 icx 2023.0.0
x86-64 icx 2023.1.0
x86-64 icx 2023.2.1
x86-64 icx 2024.0.0
x86-64 icx 2024.1.0
x86-64 icx 2024.2.0
x86-64 icx 2025.0.0
x86-64 icx 2025.0.0
zig c++ 0.10.0
zig c++ 0.11.0
zig c++ 0.12.0
zig c++ 0.12.1
zig c++ 0.13.0
zig c++ 0.6.0
zig c++ 0.7.0
zig c++ 0.7.1
zig c++ 0.8.0
zig c++ 0.9.0
zig c++ trunk
Options
Source code
/* All rights reserved: Maysara Khalid Elshewehy [github.com/xeerx] Created on: 4 Apr 2022 Commercial use of this file is prohibited without written permission */ #ifndef XCPP_XSTRING_H #define XCPP_XSTRING_H #include <string.h> // strlen #include <cstdlib> // calloc, realloc, free #include <initializer_list> // initializer_list #include <stddef.h> // size_t #include <stdint.h> // SIZE_MAX #include <ostream> // ostream operator // xstring macros #define xnpos SIZE_MAX // max size of size_t, when error, return to it #define _xs_extra_space_ 25 // the extra space size in heap memory // xstring helpers namespace x::hlpr { // [INTEGER LENGTH] #define __sig_int_len__(t) (t int src) { unsigned t int len = src < 0 ? 1 : 0; while(true) { src /= 10; if(src != 0) len ++; else return len; } } #define __uns_int_len__(t) (unsigned t int src) { unsigned t int len = 0; while(true) { src /= 10; if(src != 0) len ++; else return len; } } unsigned int intlen __sig_int_len__() unsigned int uintlen __uns_int_len__() unsigned short int sintlen __sig_int_len__(short) unsigned short int usintlen __uns_int_len__(short) unsigned long lintlen __sig_int_len__(long) unsigned long ulintlen __uns_int_len__(long) unsigned long long llintlen __sig_int_len__(long long) unsigned long long ullintlen __uns_int_len__(long long) // [INTEGER TO STRING] #define __sig_int_str__(s,t) (char *ref, s src, unsigned s len = 0) { if(src == 0){ ref[0] = '0'; ref[1] = '\0'; return; } if (len == 0) len = t(src) + 1; if (src < 0) { src = src * -1; ref[0] = '-'; } len--; ref[len + 1] = '\0'; while (src > 0) { ref[len] = src % 10 + '0'; src /= 10; len--; } } #define __uns_int_str__(s,t) (char *ref, unsigned s src, unsigned s len = 0) { if(src == 0){ ref[0] = '0'; ref[1] = '\0'; return; } if(len == 0) len = t(src) +1; len --; ref[len+1] = '\0'; while(src >= 1) { ref[len] = src % 10 + '0'; src /= 10; len --; } } void intstr __sig_int_str__(int,intlen) void uintstr __uns_int_str__(int ,uintlen) void sintstr __sig_int_str__(short int,sintlen) void usintstr __uns_int_str__(short int ,usintlen) void lintstr __sig_int_str__(long int,lintlen) void ulintstr __uns_int_str__(long int ,ulintlen) void llintstr __sig_int_str__(long long int,llintlen) void ullintstr __uns_int_str__(long long int ,ullintlen) // [INTEGER MACROS] #define __int_str_shortcut__(src,l,lfunc,sfunc) unsigned l __len = x::hlpr::lfunc(src) +1; char * __ref = new char[__len+1]; x::hlpr::sfunc(__ref,src,__len); delete [] __ref; #define __intstr__(src) __int_str_shortcut__(src,int,intlen,intstr) #define __uintstr__(src) __int_str_shortcut__(src,int,uintlen,uintstr) #define __sintstr__(src) __int_str_shortcut__(src,short int,sintlen,sintstr) #define __usintstr__(src) __int_str_shortcut__(src,short int,usintlen,usintstr) #define __lintstr__(src) __int_str_shortcut__(src,long int,lintlen,lintstr) #define __ulintstr__(src) __int_str_shortcut__(src,long int,ulintlen,ulintstr) #define __llintstr__(src) __int_str_shortcut__(src,long long int,llintlen,llintstr) #define __ullintstr__(src) __int_str_shortcut__(src,long long int,ullintlen,ullintstr) // [DECIMAL LENGTH] #define __decimal_len__(t) (t src, unsigned short int max = 6) { unsigned int len = 0, ilen = 0, i = 0; int isrc = (int)src; if(src < 0) src *= -1; if(src > 0) { ilen = intlen(isrc); src -= isrc;} while(i < max && (isrc - src) != 0) { src = src * 10; i++; len ++; } return len + ilen; } unsigned int floatlen __decimal_len__(float) unsigned int doublelen __decimal_len__(double) unsigned int ldoublelen __decimal_len__(long double) // [DECIMAL TO STRING] #define __decimal_str__(t,lfunc) (char *ref, t src, unsigned short int max = 0, bool setmax = false) { bool neg = false; if(src < 0) { src = src * -1; neg = true; } if(src == 0) { ref[0] = '0'; ref[1] = '.'; ref[2] = '0'; ref[3] = '\0'; } int numbers = src, digit = 0, numberslen = x::hlpr::intlen(numbers), index = numberslen + 1; long pow_value = 0; unsigned int flen = x::hlpr::lfunc(src); if(numberslen > 0) flen -= numberslen; if(!max) max = flen; else if(setmax) max -= numberslen; max --; x::hlpr::intstr(ref,numbers,index); ref[index] = '.'; index ++; if(numbers == src) { ref[index] = '0'; index ++; if(neg) { unsigned int bi = index; ref[bi] = '\0'; while (index >= 0) { ref[index+1] = ref[index]; index --; } ref[0] = '-'; return bi +1; } else ref[index] = '\0'; return index; } t fraction_part = src - numbers; t tmp1 = fraction_part, tmp =0; for( int i= 1; i < max + 2; i++) { pow_value = 10; tmp = tmp1 * pow_value; digit = tmp; ref[index] = digit +48; tmp1 = tmp - digit; index ++; } int temp_index = index -1; while(temp_index >= 0) { if(ref[temp_index] == '0') { ref[temp_index] = '\0'; index --; } else break; temp_index --; } temp_index = index -1; while(temp_index >= 0) { if(ref[temp_index] == ref[temp_index-1]) { ref[temp_index] = '\0'; index --; } else break; temp_index --; } if(neg) { unsigned int bi = index; ref[bi] = '\0'; while (index >= 0) { ref[index+1] = ref[index]; index --; } ref[0] = '-'; return bi+1; } else ref[index] = '\0'; return index;} unsigned int floatstr __decimal_str__(float,floatlen) unsigned int doublestr __decimal_str__(double,doublelen) unsigned int ldoublestr __decimal_str__(long double,ldoublelen) // [DECIMAL MACROS] #define __decimal_str_shortcut__(src,lfunc,sfunc,max) unsigned short int __len = x::hlpr::lfunc(src,max) +1; char * __ref = new char[__len+4];__len = x::hlpr::sfunc(__ref,src,__len,true); delete [] __ref; #define __floatstr__(src) __decimal_str_shortcut__(src,floatlen,floatstr,max) #define __doublestr__(src) __decimal_str_shortcut__(src,doublelen,doublestr,max) #define __ldoublestr__(src) __decimal_str_shortcut__(src,ldoublelen,ldoublestr,max) } // xstring class namespace x { // some variables used to return to error char xstr_null_char = '\0'; class xstring { public: // data char *src = nullptr; // pointer to character array wich contains to value of object size_t len = 0; // length of src, zero means empty size_t siz = 0; // size of src in heap memory // constructor -> default empty xstring () { } xstring (const char *ref, size_t rlen = 0) { set(ref,rlen); } xstring (char ref) { set(ref); } xstring (bool ref) { set(ref); } xstring ( int ref) { set(ref); } xstring (unsigned int ref) { set(ref); } xstring (short int ref) { set(ref); } xstring (unsigned short int ref) { set(ref); } xstring (long int ref) { set(ref); } xstring (unsigned long int ref) { set(ref); } xstring (long long int ref) { set(ref); } xstring (unsigned long long int ref) { set(ref); } xstring (float ref,unsigned short max = 1) { set(ref,max); } xstring (double ref,unsigned short max = 1) { set(ref,max); } xstring (long double ref,unsigned short max = 1) { set(ref,max); } xstring (xstring &ref) { set(ref); } xstring (const xstring &ref) { set(ref); } template <typename T> xstring (std::initializer_list<T> ref) { for(auto i:ref) append(i); } // set bool set (const char *ref, size_t rlen); bool set (char ref) { char __ref[] = {ref}; return set(__ref, 1); } bool set (bool ref) { return set(ref ? "1" : "0", 1); } bool set ( int ref) { __intstr__ (ref) return set(__ref, __len); } bool set (unsigned int ref) { __uintstr__ (ref) return set(__ref, __len); } bool set (short int ref) { __sintstr__ (ref) return set(__ref, __len); } bool set (unsigned short int ref) { __usintstr__ (ref) return set(__ref, __len); } bool set (long int ref) { __lintstr__ (ref) return set(__ref, __len); } bool set (unsigned long int ref) { __ulintstr__ (ref) return set(__ref, __len); } bool set (long long int ref) { __llintstr__ (ref) return set(__ref, __len); } bool set (unsigned long long int ref) { __ullintstr__ (ref) return set(__ref, __len); } bool set (float ref,unsigned short max = 1) { __floatstr__ (ref) return set(__ref, __len); } bool set (double ref,unsigned short max = 1) { __doublestr__ (ref) return set(__ref, __len); } bool set (long double ref,unsigned short max = 1) { __ldoublestr__ (ref) return set(__ref, __len); } bool set (xstring &ref) { if(&ref != this) return set(ref.src, ref.len); else return false; } bool set (const xstring &ref) { if(&ref != this) return set(ref.src, ref.len); else return false; } template <typename T> bool set (std::initializer_list<T> ref) { reset(); for(auto i:ref) if(!append(i)) return false; return true; } template <typename T> bool operator = (T ref) { return set(ref); } template <typename T> bool operator = (std::initializer_list<T> ref) { return set(ref); } // append bool append (const char *ref, size_t rlen); bool append (char ref) { char __ref[] = {ref}; return append(__ref, 1); } bool append (bool ref) { return append(ref ? "1" : "0", 1); } bool append ( int ref) { __intstr__ (ref) return append(__ref, __len); } bool append (unsigned int ref) { __uintstr__ (ref) return append(__ref, __len); } bool append (short int ref) { __sintstr__ (ref) return append(__ref, __len); } bool append (unsigned short int ref) { __usintstr__ (ref) return append(__ref, __len); } bool append (long int ref) { __lintstr__ (ref) return append(__ref, __len); } bool append (unsigned long int ref) { __ulintstr__ (ref) return append(__ref, __len); } bool append (long long int ref) { __llintstr__ (ref) return append(__ref, __len); } bool append (unsigned long long int ref) { __ullintstr__ (ref) return append(__ref, __len); } bool append (float ref,unsigned short max = 1) { __floatstr__ (ref) return append(__ref, __len); } bool append (double ref,unsigned short max = 1) { __doublestr__ (ref) return append(__ref, __len); } bool append (long double ref,unsigned short max = 1) { __ldoublestr__ (ref) return append(__ref, __len); } bool append (xstring &ref) { if(&ref != this) return append(ref.src, ref.len); else return false; } bool append (const xstring &ref) { if(&ref != this) return append(ref.src, ref.len); else return false; } template <typename T> bool append (std::initializer_list<T> ref) { for(auto i:ref) if(!append(i)) return false; return true; } template <typename T> bool operator += (T ref) { return append(ref); } template <typename T> bool operator += (std::initializer_list<T> ref) { return append(ref); } // prepend bool prepend (const char *ref, size_t rlen); bool prepend (char ref) { char __ref[] = {ref}; return prepend(__ref, 1); } bool prepend (bool ref) { return prepend(ref ? "1" : "0", 1); } bool prepend ( int ref) { __intstr__ (ref) return prepend(__ref, __len); } bool prepend (unsigned int ref) { __uintstr__ (ref) return prepend(__ref, __len); } bool prepend (short int ref) { __sintstr__ (ref) return prepend(__ref, __len); } bool prepend (unsigned short int ref) { __usintstr__ (ref) return prepend(__ref, __len); } bool prepend (long int ref) { __lintstr__ (ref) return prepend(__ref, __len); } bool prepend (unsigned long int ref) { __ulintstr__ (ref) return prepend(__ref, __len); } bool prepend (long long int ref) { __llintstr__ (ref) return prepend(__ref, __len); } bool prepend (unsigned long long int ref) { __ullintstr__ (ref) return prepend(__ref, __len); } bool prepend (float ref,unsigned short max = 1) { __floatstr__ (ref) return prepend(__ref, __len); } bool prepend (double ref,unsigned short max = 1) { __doublestr__ (ref) return prepend(__ref, __len); } bool prepend (long double ref,unsigned short max = 1) { __ldoublestr__ (ref) return prepend(__ref, __len); } bool prepend (xstring &ref) { if(&ref != this) return prepend(ref.src, ref.len); else return false; } bool prepend (const xstring &ref) { if(&ref != this) return prepend(ref.src, ref.len); else return false; } template <typename T> bool prepend (std::initializer_list<T> ref) { for(auto i:ref) if(!prepend(i)) return false; return true; } template <typename T> bool operator |= (T ref) { return prepend(ref); } template <typename T> bool operator |= (std::initializer_list<T> ref) { return prepend(ref); } // print friend std::ostream &operator<<(std::ostream &os, const xstring &s) { os << (s.src ? s.src : ""); return (os); } // insert bool insert (size_t pos, const char *ref, size_t rlen); bool insert (size_t pos, char ref) { char __ref[] = {ref}; return insert(pos,__ref, 1); } // compare between two strings bool compare(const char *ref) { return strcmp(src,ref) == 0; } bool compare(xstring& ref) { return compare(ref.src); } bool compare(const xstring& ref) { return compare(ref.src); } bool compare( char ref) { char __ref[] = {ref}; return compare(__ref); } bool operator == (const char *ref) { return compare(ref) == true; } bool operator == (xstring& ref) { return compare(ref) == true; } bool operator == (const xstring& ref) { return compare(ref) == true; } bool operator == ( char ref) { return compare(ref) == true; } // no need in C++ 20 // bool operator != (const char *ref) { return compare(ref) == false; } // bool operator != (xstring& ref) { return compare(ref) == false; } // bool operator != (const xstring& ref) { return compare(ref) == false; } // bool operator != ( char ref) { return compare(ref) == false; } // swap value,len,size between two string objects void swap(xstring &ref) { char *tmp_src = src; size_t tmp_len = len; size_t tmp_siz = siz; src = ref.src; len = ref.len; siz = ref.siz; ref.src = tmp_src; ref.len = tmp_len; ref.siz = tmp_siz; } // convert src characters to lower case void to_lower() { size_t i = 0; while(src[i] != '\0') { src[i] = std::tolower(src[i]); i++; } } // convert src characters to upper case void to_upper() { size_t i = 0; while(src[i] != '\0') { src[i] = std::toupper(src[i]); i++; } } // select character by index, return xstr_null_char if not found char& getChar(size_t ref) { if(ref > len) return xstr_null_char; return src[ref]; } char& operator[](size_t ref) { return getChar(ref); } // select index by value, start from position, return xnpos if not found size_t getIndex(char ref, size_t pos = 0) { if(pos > len) return xnpos; size_t counter = pos; while(counter < len) { if(src[counter] == ref) return counter; counter ++; } return xnpos; } // get last character char& getLast() { return src[len-1]; } // remove from value by index bool pop(size_t pos = 0, size_t max = 1) { if(pos >= len) return false; if(max > len || max == 0) max = len; memmove(&src[pos], &src[pos + max], len - pos - 1); src[len - 1] = '\0'; len --; return true; } // remove last character using pop(len-1) bool pop_last() { return pop(len-1); } // reverse characters void reverse() { char *tmp = new char[len]; size_t count = len; size_t count_src = 0; while(count > 0) { tmp[count-1] = src[count_src]; count --; count_src ++; } tmp[len] = '\0'; memcpy(src,tmp,len+1); delete [] tmp; } // check if value is empty by check if length equals zero bool empty() { return len == 0; } // find first matched character in string, start from begin + pos, if failed return to xnpos size_t first_of(char ref, size_t pos = 0) { if(pos >= len) return xnpos; while( src[pos]!=ref && pos < len) pos++; return pos == len ? xnpos : pos; } // find last matched character in string, start from end - pos, if failed return to xnpos size_t last_of (char ref, size_t pos = 0) { if(pos >= len) return xnpos; pos = len - pos -1; while(src[pos]!=ref && pos > 0) pos--; if(src[pos] == ref) return pos; else return xnpos; } // cut string from [start] to [end] and set to ref bool sub(xstring &ref, size_t start = 0, size_t end = 0) { if(start >= len) start = len -1; if(start == end) return false; if(end == 0 || end >= len) end = len; size_t llen = end - start; char *res = new char[llen+1]; size_t pos = 0; while(start < end) { res[pos] = src[start]; start ++; pos ++; } res[pos] = '\0'; ref.set(res, llen+1); delete [] res; return true; } // free memory, set values to zero void reset () { if(!siz) return; free(src); len = 0; siz = 0; } // destructor ~xstring () { reset(); } }; } // xstring class functions, i will write long functions here to arrange the file and keep it beautiful namespace x { /** * @brief set value of xstring object */ bool xstring::set (const char *ref, size_t rlen = 0) { if(!rlen) rlen = strlen(ref); // [increase performance] If the length is known, there is no need to recalculate it if(siz == 0) // alloc space in heap memory to store value { siz = rlen + _xs_extra_space_; // [increase performance] extra 25 bytes space to avoid realloc in next times if space is enough if(siz >= xnpos - 25) { siz -= rlen + _xs_extra_space_; return false; } // check if size > max size src = (char*) calloc(siz, sizeof(char)); // allocate space if(src == nullptr) return false; // check if space is allocated } else if(siz <= rlen) // realloc more space to contains the new value { siz = rlen + _xs_extra_space_; if(siz >= xnpos - 25) { siz -= rlen + _xs_extra_space_; return false; } src = (char*) realloc(src, siz * sizeof(char)); if(src == nullptr) return false; } memcpy(src, ref, rlen+1); // copy value from ref len = rlen; // update length src[len] = '\0'; // terminate the array return true; } /** * @brief add value to begin of xstring object */ bool xstring::append (const char *ref, size_t rlen = 0) { if(siz == 0) return set(ref,rlen); // if space is null, call set() if(!rlen) rlen = strlen(ref); if(siz <= (len + rlen)) { siz += rlen + _xs_extra_space_; if(siz >= xnpos - 25) { siz -= rlen + _xs_extra_space_; return false; } src = (char*) realloc(src, siz * sizeof(char)); if(src == nullptr) return false; } memcpy(src + len, ref, rlen+1); len += rlen; src[len] = '\0'; return true; } /** * @brief add value to end of xstring object */ bool xstring::prepend (const char *ref, size_t rlen = 0) { if(siz == 0) return set(ref,rlen); if(!rlen) rlen = strlen(ref); if(siz <= (len + rlen)) { siz += rlen + _xs_extra_space_; if(siz >= xnpos - 25) { siz -= rlen + _xs_extra_space_; return false; } src = (char*) realloc(src, siz * sizeof(char)); if(src == nullptr) return false; } memmove(src + rlen, src, len); // move data to rlen pos size_t i = 0; while(i < rlen) // loop in copy ref to begin of src { src[i] = ref[i]; ++i; } len += rlen; src[len] = '\0'; return true; } /** * @brief add value to position of xstring object */ bool xstring::insert (size_t pos, const char *ref, size_t rlen = 0) { if(siz == 0) return set(ref,rlen); if(pos > len) return false; if(!rlen) rlen = strlen(ref); if(siz <= (len + rlen)) { siz += rlen + _xs_extra_space_; if(siz >= xnpos - 25) { siz -= rlen + _xs_extra_space_; return false; } src = (char*) realloc(src, siz * sizeof(char)); if(src == nullptr) return false; } memmove(src + rlen, src, len); size_t i = 0; while(true) { size_t target = pos == 0 ? (0 + i) : (pos+i); src[target] = ref[i]; if(++i >= rlen) break;; } len += rlen; src[len] = '\0'; return true; } } #endif #include <iostream> #include <string> int main() { using namespace std::literals; std::cout << "\nStrings:\n"; std::cout << x::xstring{"abc"} << '\n'; std::cout << "abc"s << '\n'; std::cout << "\nIntegers:\n"; std::cout << x::xstring{123} << '\n'; std::cout << std::to_string(123) << '\n'; std::cout << "\nFloating point:\n"; std::cout << x::xstring{123.456} << '\n'; std::cout << std::to_string(123.456) << '\n'; }
Become a Patron
Sponsor on GitHub
Donate via PayPal
Source on GitHub
Mailing list
Installed libraries
Wiki
Report an issue
How it works
Contact the author
CE on Mastodon
CE on Bluesky
About the author
Statistics
Changelog
Version tree