67 Commits

Author SHA1 Message Date
abdelrahman 66acbaad9e Release v2.5.0
Release / release (push) Successful in 3s
2026-09-24 00:53:36 +01:00
abdelrahman 180292289d Add hash map implementation
Release / release (push) Successful in 3s
2026-09-24 00:52:43 +01:00
abdelrahman 68640dc5e2 Add hash set implementation
Release / release (push) Successful in 4s
2026-09-23 22:34:23 +01:00
Abdelrahman Said 20e890964f Add hash table for default hasher
Release / release (push) Successful in 3s
2026-09-23 00:21:51 +01:00
Abdelrahman Said c215486442 Restructure hasher implementation
Release / release (push) Successful in 3s
2026-09-23 00:02:37 +01:00
Abdelrahman Said 9881c0ac9a Update hasher data to context
Release / release (push) Successful in 4s
2026-09-22 21:47:46 +01:00
abdelrahman 17be4841e6 Update siphash comment
Release / release (push) Successful in 3s
2026-09-22 00:57:46 +01:00
abdelrahman 421728c137 Add internal hash table implementation
Release / release (push) Successful in 4s
2026-09-21 22:15:54 +01:00
abdelrahman b014ffa3b1 Add swap utility 2026-09-21 22:03:54 +01:00
abdelrahman 8da18774f0 Update array remove swap to handle deleting last index 2026-09-21 22:03:40 +01:00
abdelrahman ac5baef3b8 Switch array NULL pointer checks to debug asserts
Release / release (push) Successful in 2s
2026-09-21 07:41:46 +01:00
abdelrahman e90229db7a Reformat
Release / release (push) Successful in 3s
2026-09-21 07:38:16 +01:00
abdelrahman 4a92f55f17 Reformat
Release / release (push) Successful in 3s
2026-09-20 21:44:48 +01:00
abdelrahman 3c81feedbb Add wpArrayRemoveSwapEnd
Release / release (push) Successful in 3s
2026-09-19 22:41:10 +01:00
Abdelrahman Said 9029e21a4f Update str8 printf spec
Release / release (push) Successful in 4s
2026-09-19 11:37:55 +01:00
abdelrahman 605c1ddfae Add wpArrayZero
Release / release (push) Successful in 3s
2026-09-16 01:28:11 +01:00
Abdelrahman Said f73a870a34 Convert hasher to interface and remove spihash64
Release / release (push) Successful in 3s
2026-09-16 01:11:24 +01:00
Abdelrahman Said 8b3b1816b3 Reformat
Release / release (push) Successful in 3s
2026-09-16 00:18:01 +01:00
Abdelrahman Said f46c3ab38a Extract splitmix64 PRNG
Release / release (push) Successful in 4s
2026-09-16 00:12:50 +01:00
abdelrahman 9226891bb9 wpArrayClear memsets members to 0
Release / release (push) Successful in 3s
2026-09-13 21:14:11 +01:00
abdelrahman 6fdda743fb Fix ArenaStorageType label
Release / release (push) Successful in 2s
2026-09-13 02:32:59 +01:00
abdelrahman 575e0a52b1 Add labels to all typedef'd structs and enums
Release / release (push) Successful in 4s
2026-09-13 02:31:46 +01:00
abdelrahman 5df1a105c7 Update C++ hasher initialisers
Release / release (push) Successful in 2s
2026-09-13 00:39:52 +01:00
abdelrahman 34a1b2c1db Fix hasher initialisers
Release / release (push) Successful in 2s
2026-09-13 00:25:03 +01:00
abdelrahman f3a8045ecc Update hasher
Release / release (push) Successful in 3s
2026-09-13 00:20:18 +01:00
abdelrahman 6a3326e9a5 Add scratchpad to .gitignore
Release / release (push) Successful in 3s
2026-09-12 21:14:57 +01:00
Abdelrahman Said 222eb006e6 Add extra reference for robin hood hash tables
Release / release (push) Successful in 3s
2026-09-06 22:53:34 +01:00
abdelrahman 5e67c596b9 Remove all uses of names starting with underscore
Release / release (push) Successful in 3s
2026-09-06 18:15:23 +01:00
abdelrahman 9055c5c825 Add more xorshift utilities
Release / release (push) Successful in 2s
2026-09-06 13:40:13 +01:00
abdelrahman c83f9333de Update xorshift PRNG
Release / release (push) Successful in 4s
2026-09-06 13:31:37 +01:00
Abdelrahman Said 07e0034783 Update CHANGELOG
Release / release (push) Successful in 2s
2026-09-02 00:13:18 +01:00
Abdelrahman Said e015dfceda Add aliases for integer constants
Release / release (push) Successful in 3s
2026-09-02 00:11:23 +01:00
Abdelrahman Said 60467d56b9 Add paper for robin hood hashing
Release / release (push) Successful in 4s
2026-09-01 21:35:58 +01:00
Abdelrahman Said 2e943affb7 Add reference for open addressing/separate chaining
Release / release (push) Successful in 2s
2026-08-31 23:43:48 +01:00
Abdelrahman Said aa48942d91 Get most recent ankerl implementation
Release / release (push) Successful in 3s
2026-08-31 23:34:56 +01:00
abdelrahman 5ae4d7d6d1 Add documents
Release / release (push) Successful in 2s
2026-08-31 21:16:21 +01:00
abdelrahman 900c16415b Add implementation for siphash
Release / release (push) Successful in 4s
2026-08-31 02:15:01 +01:00
abdelrahman bca2e720ad Add Murmur3 validation
Release / release (push) Successful in 3s
2026-08-30 23:56:50 +01:00
abdelrahman 850f709a10 Update Murmur3 hasher IO
Release / release (push) Successful in 3s
2026-08-30 23:50:22 +01:00
abdelrahman 55ff77c4ea Add implementation for the murmur3 x64_128 hash
Release / release (push) Successful in 3s
2026-08-30 22:03:28 +01:00
abdelrahman d5578f009a Update stream utilities and fix peek logic
Release / release (push) Successful in 4s
2026-08-30 17:13:32 +01:00
abdelrahman b3830683f6 Print changelog contents to stdout
Release / release (push) Successful in 3s
2026-08-30 14:34:21 +01:00
abdelrahman 0060c51c12 Only extract changelog for new releases
Release / release (push) Successful in 3s
2026-08-30 14:31:11 +01:00
abdelrahman 23613d16b7 Update release workflow
Release / release (push) Successful in 4s
2026-08-30 14:20:47 +01:00
abdelrahman 8cd1d56b4a Save extracted changelog in workspace 2026-08-30 14:20:40 +01:00
abdelrahman 6b8fe820aa Remove empty line for testing
Release / release (push) Failing after 1s
2026-08-30 13:49:15 +01:00
abdelrahman 2554810306 Use python3 in release workflow
Release / release (push) Failing after 3s
2026-08-30 13:48:24 +01:00
abdelrahman 08029141d4 Extract version changelog in release process
Release / release (push) Failing after 4s
2026-08-30 13:45:40 +01:00
abdelrahman a1123b361d Include CHANGELOG file in release packages 2026-08-30 13:45:21 +01:00
abdelrahman f4d2e551b5 Add CHANGELOG 2026-08-30 12:39:03 +01:00
abdelrahman 1bbe124e3e Update VERSION
Release / release (push) Successful in 5s
2026-08-30 02:32:35 +01:00
abdelrahman c1b2e29c07 Add stream structure and utilities 2026-08-30 02:21:08 +01:00
abdelrahman a51686c8f0 Add compiler detection macros 2026-08-30 00:15:36 +01:00
Abdelrahman Said f599b5f425 Reformat
Release / release (push) Successful in 3s
2026-08-22 20:32:58 +01:00
abdelrahman 0063bb8641 Fix missing log in Makefile
Release / release (push) Successful in 4s
2026-08-17 05:24:10 +01:00
abdelrahman 2a20362b44 Add free array and queue utils
Release / release (push) Successful in 7s
2026-07-05 20:51:17 +01:00
Abdelrahman Said 02372cb644 Fix mem op supported bug
Release / release (push) Successful in 6s
2026-06-28 21:46:36 +01:00
Abdelrahman Said 5804c5d345 Add function to check memory op support for allocators
Release / release (push) Successful in 7s
2026-06-28 14:03:58 +01:00
Abdelrahman Said ffdeb5fdc2 Reformat
Release / release (push) Successful in 6s
2026-06-27 22:01:38 +01:00
abdelrahman a998f6b981 Standardize naming conventions (#12)
Release / release (push) Successful in 8s
## Summary

Standardize naming conventions across the entire wizapp-stdlib codebase by replacing inconsistent prefixes and snake_case with a unified `wp` prefix + CamelCase scheme.

## Changes

### Naming convention applied

| Pattern | Before | After |
|---|---|---|
| Public functions | `wapp_module_function` | `wpModuleFunction` |
| Public types | `GenericXxx`, bare `Xxx` | `WpXxx` |
| Constants / enum values | `WAPP_XXX`, `SHELL_XXX` | `WP_XXX`, `WP_SHELL_XXX` |
| Internal functions | `_module_function` | `_moduleFunction` |
| Storage-class macros | `wapp_extern`, `wapp_intern` | `wp_extern`, `wp_intern` |

### Modules affected

All 20 modules were renamed: `arena`, `array`, `dbl_list`, `queue`, `str8`, `mem_allocator`, `mem_utils`, `mem_os`, `file`, `cpath`, `log`, `shell_commander`, `shell_termcolour`, `shell_utils`, `prng/xorshift`, `uuid`, `tester`, `aliases`, `assert`, `misc_utils`, `platform` — plus their test files.

### Backward compatibility

Added `src/oldnames.h` with `#define OLD_NAME NEW_NAME` for every renamed symbol, organized by module under Constants → Types → Functions sections. Existing code that includes this file will compile without changes.

Reviewed-on: #12
Co-authored-by: Abdelrahman <said.abdelrahman89@gmail.com>
Co-committed-by: Abdelrahman <said.abdelrahman89@gmail.com>
2026-06-26 17:17:27 +00:00
Abdelrahman Said ea689e7357 Bump version number
Release / release (push) Successful in 8s
2026-06-23 23:48:44 +01:00
Abdelrahman Said a97b8f742a Update logging 2026-06-23 23:48:19 +01:00
Abdelrahman Said 99902cfa99 Add utilities to write strings to file 2026-06-23 23:48:02 +01:00
abdelrahman 7a314a0038 Fix include paths
Release / release (push) Successful in 4s
2026-05-25 17:41:52 +01:00
abdelrahman f073e5a21f v1.1.1
Release / release (push) Successful in 6s
2026-05-25 17:35:05 +01:00
abdelrahman 536a1a3b01 v1.1.1
Release / release (push) Has been cancelled
2026-05-25 16:38:40 +01:00
abdelrahman a6b697dd0e Pad logger struct for MSVC
Release / release (push) Successful in 3s
2026-05-17 17:46:50 +01:00
133 changed files with 8521 additions and 3610 deletions
+30 -12
View File
@@ -34,6 +34,21 @@ jobs:
echo "version=$VERSION" >> $GITHUB_OUTPUT echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Extract version changelog
if: steps.tag.outputs.version
id: changelog
run: |
VERSION="${{ steps.tag.outputs.version }}"
CHANGELOG_FILE=$(python3 scripts/get_changelog.py $VERSION)
if [[ $? != 0 ]]; then
echo "No changelog found for version $VERSION"
exit 1
fi
cat "$CHANGELOG_FILE"
echo "changelog_file=$CHANGELOG_FILE" >> $GITHUB_OUTPUT
- name: Build Artifacts - name: Build Artifacts
if: steps.tag.outputs.version if: steps.tag.outputs.version
run: | run: |
@@ -46,17 +61,17 @@ jobs:
id: create_release id: create_release
run: | run: |
VERSION="${{ steps.tag.outputs.version }}" VERSION="${{ steps.tag.outputs.version }}"
RESPONSE=$(curl -s -X POST \ CHANGELOG_FILE="${{ steps.changelog.outputs.changelog_file }}"
-H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \ RESPONSE=$(jq -n \
-H "Content-Type: application/json" \ --arg tag "v$VERSION" \
"https://git.thewizardapprentice.com/api/v1/repos/${{ gitea.repository }}/releases" \ --arg name "wapp-v$VERSION" \
-d '{ --rawfile body "$CHANGELOG_FILE" \
"tag_name": "v'"$VERSION"'", '{tag_name: $tag, name: $name, body: $body, draft: false, prerelease: false}' \
"name": "wapp-v'"$VERSION"'", | curl -s -X POST \
"body": "Automated release for wapp-v'"$VERSION"'", -H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \
"draft": false, -H "Content-Type: application/json" \
"prerelease": false --data-binary @- \
}') "https://git.thewizardapprentice.com/api/v1/repos/${{ gitea.repository }}/releases")
echo "$RESPONSE" echo "$RESPONSE"
RELEASE_ID=$(echo $RESPONSE | jq -r '.id') RELEASE_ID=$(echo $RESPONSE | jq -r '.id')
@@ -78,4 +93,7 @@ jobs:
- name: Cleanup - name: Cleanup
if: steps.tag.outputs.version if: steps.tag.outputs.version
run: rm -rf dist/* run: |
CHANGELOG_FILE="${{ steps.changelog.outputs.changelog_file }}"
rm -rf dist/*
rm -f "$CHANGELOG_FILE"
+1
View File
@@ -10,5 +10,6 @@ test.*
compile_commands.json compile_commands.json
libwapp-build libwapp-build
dist dist
scratchpad
*.vs *.vs
__pycache__ __pycache__
+76
View File
@@ -0,0 +1,76 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [2.5.0] - 2026-09-24
### Added
- `wpMiscUtilsRotl64` utility
- `WpHasher` interface
- `wpCustomHasher` constructor for custom hasher with user-defined context
- `wpHasherGetHash128` and `wpHasherGetHash64` utilities
- `wpX64Mur3Hasher` and `wpX64Mur3HasherWithSeed` constructors for the hasher interface
- `wpX64Mur3GetHash128` implementation for the x64 128-bit variant of the MurmurHash3 algorithm
- `wpSip24Hasher`, `wpSip48Hasher`, `wpSip24HasherWithKey` and `wpSip48HasherWithKey` constructors for the hasher interface
- `wpSipGetHash128` implementation for the 128 variant of siphash
- `wpHashSet`, `wpHashSetCustomHasher`, `wpHashSetAlloc` and `wpHashSetCustomHasherAlloc` constructors
- `wpHashSetFind`, `wpHashSetInsertCapped`, `wpHashSetInsertAlloc`, `wpHashSetRemove`, `wpHashSetItems`, `wpHashSetCapacity`, `wpHashSetCount`, `wpHashSetItemSize`, `wpHashSetClear` and `wpHashSetDealloc` utilities
- `wpHashMap`, `wpHashMapCustomHasher`, `wpHashMapAlloc` and `wpHashMapCustomHasherAlloc` constructors
- `wpHashMapKeys`, `wpHashMapValues`, `wpHashMapCapacity`, `wpHashMapCount`, `wpHashMapKeySize`, `wpHashMapValueSize`, `wpHashMapFind`, `wpHashMapInsertCapped`, `wpHashMapInsertOrUpdateCapped`, `wpHashMapUpdate`, `wpHashMapInsertAlloc`, `wpHashMapInsertOrUpdateAlloc`, `wpHashMapRemove`, `wpHashMapClear` and `wpHashMapDealloc` utilities
- `wpU8Const`, `wpU16Const`, `wpU32Const`, `wpU64Const`, `wpI8Const`, `wpI16Const`, `wpI32Const`, and `wpI64Const` aliases
- `wpPrngXorshiftInitWithSeed` to allow for user control with PRNG
- `wpPrngXorshift256InRange`, `wpPrngXorshift256ssInRange`, `wpPrngXorshift256pInRange`, `wpPrngXorshift256Choice`, `wpPrngXorshift256ssChoice` and `wpPrngXorshift256pChoice` utilities
- `WpSplitmix64State`
- `wpPrngSplitmix64Init`, `wpPrngSplitmix64InitWithSeed`, `wpPrngSplitmix64`, `wpPrngSplitmix64InRange`, `wpPrngSplitmix64Choice`
- `wpStr8Clear`
- `wpArrayZero` to zero all elements in an array without setting the count to 0
- `wpArrayRemoveSwapEnd` to remove an array element using its index and swap the last element in
### Changed
- Switched to using `wpMiscUtilsRotl64` in `xorshift`
- Remove all uses of names starting with underscore
- Ensure `wpArrayClear` memsets members to 0
- Removed '%' from `WP_STR8_SPEC`
## [2.4.0] - 2026-08-30
### Added
- `wpStreamHasCount`, `wpStreamPeekWithOffset` and `wpStreamConsumeCount` utilities
### Fixed
- Logic for peeking at stream contents
## [2.3.0] - 2026-08-29
### Added
- Compiler detection macros:
- `WP_PLATFORM_CLANG` for the clang compiler
- `WP_PLATFORM_CLANGPP` for the clang++ compiler
- `WP_PLATFORM_CLANG_MAJOR` Major version number for the clang/clang++ compiler
- `WP_PLATFORM_CLANG_MINOR` Minor version number for the clang/clang++ compiler
- `WP_PLATFORM_CLANG_PATCH` Patch version number for the clang/clang++ compiler
- `WP_PLATFORM_GCC` for the gcc compiler
- `WP_PLATFORM_GPP` for the g++ compiler
- `WP_PLATFORM_GCC_MAJOR` Major version number for the gcc/g++ compiler
- `WP_PLATFORM_GCC_MINOR` Minor version number for the gcc/g++ compiler
- `WP_PLATFORM_GCC_PATCH` Patch version number for the gcc/g++ compiler
- `WP_PLATFORM_MSVC` for Microsoft's Visual C++ compiler
- `WP_PLATFORM_MSVC_FULL_VERSION` Full version string for the MSVC compiler
- `WP_PLATFORM_MSVC_VERSION` Version string for the MSVC compiler
- Generic `WpStream` struct to wrap a stream of data
- `WpVoidPtrStream`, `WpC8Stream`, `WpC16Stream`, `WpC32Stream`, `WpU8Stream`, `WpU16Stream`, `WpU32Stream`, `WpU64Stream`, `WpB8Stream`, `WpI8Stream`, `WpI16Stream`, `WpI32Stream`, `WpI64Stream`, `WpF32Stream`, `WpF64Stream`, `WpF128Stream`, `WpUptrStream`, `WpIptrStream` and `WpStr8Stream` aliases for `WpStream` for readability
- Utilities for working with data streams:
- `wpStreamAtEnd`
- `wpStreamHasNext`
- `wpStreamPeek`
- `wpStreamConsume`
+8 -4
View File
@@ -34,9 +34,9 @@ override HEADER_INSTALL_CMD := scripts/header_install.sh
ifeq ($(origin BUILD_FLAGS), undefined) ifeq ($(origin BUILD_FLAGS), undefined)
ifeq ($(BUILD_TYPE),Debug) ifeq ($(BUILD_TYPE),Debug)
BUILD_FLAGS += -g -fsanitize=address,undefined -DWAPP_DEBUG_ASSERT BUILD_FLAGS += -g -fsanitize=address,undefined -DWP_DEBUG_ASSERT
else ifeq ($(BUILD_TYPE),RelWithDebInfo) else ifeq ($(BUILD_TYPE),RelWithDebInfo)
BUILD_FLAGS += -g -O2 -fsanitize=address,undefined -DWAPP_DEBUG_ASSERT BUILD_FLAGS += -g -O2 -fsanitize=address,undefined -DWP_DEBUG_ASSERT
else ifeq ($(BUILD_TYPE),Release) else ifeq ($(BUILD_TYPE),Release)
BUILD_FLAGS += -O3 BUILD_FLAGS += -O3
else else
@@ -46,7 +46,7 @@ endif
# Disable runtime asserts # Disable runtime asserts
ifeq ($(RUNTIME_ASSERT), false) ifeq ($(RUNTIME_ASSERT), false)
override BUILD_FLAGS += -DWAPP_NO_RUNTIME_ASSERT override BUILD_FLAGS += -DWP_NO_RUNTIME_ASSERT
endif endif
ifeq ($(CC),gcc) ifeq ($(CC),gcc)
@@ -121,13 +121,17 @@ help:
@$(ECHO_E) " $(GREEN)make help$(RESET) Print this help message and exit." @$(ECHO_E) " $(GREEN)make help$(RESET) Print this help message and exit."
full: LIB_SRC = src/wapp.c full: LIB_SRC = src/wapp.c
full: INCLUDES = common os base prng testing uuid full: INCLUDES = common os base log prng testing uuid
full: install full: install
base: LIB_SRC = src/base/wapp_base.c base: LIB_SRC = src/base/wapp_base.c
base: INCLUDES = common base base: INCLUDES = common base
base: install base: install
log: LIB_SRC = src/log/wapp_log.c
log: INCLUDES = common os base log
log: install
os: LIB_SRC = src/os/wapp_os.c os: LIB_SRC = src/os/wapp_os.c
os: INCLUDES = common os base os: INCLUDES = common os base
os: install os: install
+1 -1
View File
@@ -1 +1 @@
1.1.0 2.5.0
+51
View File
@@ -0,0 +1,51 @@
# Hash Tables References
## SwissTable
- [Designing a Fast, Efficient, Cache-friendly Hash Table, Step by Step](https://www.youtube.com/watch?v=ncHmEUmJZf4)
- [Abseil blog announcement](https://abseil.io/blog/20180927-swisstables)
- [Abseil design notes](https://abseil.io/about/design/swisstables)
- [Faultlore hashbrown-TLDR](https://faultlore.com/blah/hashbrown-tldr)
- [hashbrown source](https://github.com/rust-lang/hashbrown/tree/master/src/raw)
- [Faster Go maps with Swiss Tables](https://go.dev/blog/swisstable)
### 64-bit hash from 128-bit hash
MurmurHash3 and SipHash return 128 bits. SwissTable expects 64 bits. XOR folding is the approach to use:
```c
uint64_t fold_128_to_64(uint128_t hash) {
return (uint64_t)(hash >> 64) ^ (uint64_t)(hash & 0xFFFFFFFFFFFFFFFF);
}
```
## Robin Hood
- [Celis (1986) — original paper proving O(1) variance, Θ(log n) max probe](https://cs.uwaterloo.ca/research/tr/1986/CS-86-14.pdf)
- [Gankra/Faultlore — clearest walkthrough from first principles](https://faultlore.com/blah/robinhood-part-1)
- [On Worst Case Robin Hood Hashing](https://cglab.ca/~morin/publications/hashing/robinhood-siamjc.pdf)
- [Sebastian Sylvan — popularized Robin Hood in systems programming](https://www.sebastiansylvan.com/post/robin-hood-hashing-should-be-your-default-hash-table-implementation/)
- [Emmanuel Goossaert — detailed C++ implementation + backward-shift deletion](http://codecapsule.com/2013/11/11/robin-hood-hashing/)
- [Martinus (Ankerl) — most widely used C++ implementation](https://github.com/martinus/unordered_dense)
- [Tessil — clean header-only C++ implementation](https://github.com/Tessil/robin-map)
- [Malte Skarupke — Robin Hood with probe count limit](https://github.com/skarupke/flat_hash_map)
- [Robin Hood Hashing Fairness in Collision Resolution](https://blog.hieunt.me/blog/robinhood-hashing)
## Robin Hood vs SwissTable
- [Rust migration PR](https://github.com/rust-lang/rust/pull/56241)
- [hashbrown deletion discussion](https://github.com/rust-lang/hashbrown/issues/503)
- [Jackson Allan benchmark](https://jacksonallan.github.io/c_cpp_hash_tables_benchmark/)
- [Richter et al. (VLDB 2015)](https://bigdata.uni-saarland.de/publications/p249-richter.pdf)
- [Poblete & Viola (2018)](https://www.cambridge.org/core/journals/combinatorics-probability-and-computing/article/abs/analysis-of-robin-hood-and-other-hashing-algorithms-under-the-random-probing-model/933D4F203E3C70EF15053287412242E0)
## Hybrid Open-Addressing/Separate-Chaining
- [Verstable](https://github.com/JacksonAllan/Verstable)
## Double Hashing
- Knuth, TAOCP Vol. 3 §6.4 — definitive analysis of double hashing probe counts
- Guibas & Szemerédi (1978) — proved double hashing is asymptotically equivalent to uniform probing
- [Heileman & Luo (2005) — "How Caching Affects Hashing" — cache-aware experimental comparison](http://siam.org/meetings/alenex05/papers/13gheileman.pdf)
- [VT Hashing Tutorial — excellent pedagogical walkthrough](https://research.cs.vt.edu/AVresearch/hashing/double.php)
- [Paul Khuong — "The Other Robin Hood Hashing" (original Celis double-hashing variant)](https://www.pvk.ca/Blog/2013/11/26/the-other-robin-hood-hashing/)
+1
View File
@@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
cp -r src wapp cp -r src wapp
cp CHANGELOG.md wapp
mkdir -p dist mkdir -p dist
+56
View File
@@ -0,0 +1,56 @@
import os
import re
import argparse
from pathlib import Path
VERSION_HEADER = re.compile(r"\[\d+.\d+.\d+\]")
SCRIPT_DIR = Path(__file__).absolute().parent.parent
def main():
parser = argparse.ArgumentParser()
parser.add_argument("version")
args = parser.parse_args()
changelog = get_changelog(args.version)
outfilename = save_changelog(args.version, changelog)
print(outfilename)
def get_changelog(version: str) -> list[str]:
changelog = SCRIPT_DIR / "CHANGELOG.md"
with changelog.open("r") as infile:
lines = infile.readlines()
start = -1
end = -1
for i, line in enumerate(lines):
if start == -1:
match = re.search(version, line)
if match is None:
continue
start = i
else:
match = VERSION_HEADER.search(line)
if match is not None:
end = i
break
if start == -1:
exit(1)
return lines[start:end] if end > -1 else lines[start:]
def save_changelog(version: str, lines: list[str]) -> str:
version_changelog = SCRIPT_DIR / f"wapp-changelog-{version}.md"
with version_changelog.open("w") as outfile:
outfile.writelines(lines)
return str(version_changelog)
if __name__ == "__main__":
main()
+159 -115
View File
@@ -7,177 +7,178 @@
#include "../../common/aliases/aliases.h" #include "../../common/aliases/aliases.h"
#include <stddef.h> #include <stddef.h>
#define _array_header(ARRAY) (ArrayHeader *)(wapp_pointer_offset(ARRAY, (i64)sizeof(ArrayHeader) * -1)) #define arrayHeader(ARRAY) (WpArrayHeader *)(wpMiscUtilsOffsetPointer(ARRAY, (i64)sizeof(WpArrayHeader) * -1))
wapp_persist inline void _array_validate(const GenericArray array, u64 item_size); wp_persist inline void arrayValidate(const WpArray array, u64 item_size);
wp_persist inline void *arrayGetItemWithOffset(const WpArray array, u64 offset);
u64 _array_count(GenericArray array) { u64 arrayCount(WpArray array) {
wapp_debug_assert(array != NULL, "`array` should not be NULL"); wpDebugAssert(array != NULL, "`array` should not be NULL");
ArrayHeader *header = _array_header(array); WpArrayHeader *header = arrayHeader(array);
wapp_runtime_assert(WAPP_ARRAY_MAGIC == header->magic, "`array` is not a valid wapp array"); wpRuntimeAssert(WP_ARRAY_MAGIC == header->magic, "`array` is not a valid wapp array");
return header->count; return header->count;
} }
u64 _array_capacity(GenericArray array) { u64 arrayCapacity(WpArray array) {
wapp_debug_assert(array != NULL, "`array` should not be NULL"); wpDebugAssert(array != NULL, "`array` should not be NULL");
ArrayHeader *header = _array_header(array); WpArrayHeader *header = arrayHeader(array);
wapp_runtime_assert(WAPP_ARRAY_MAGIC == header->magic, "`array` is not a valid wapp array"); wpRuntimeAssert(WP_ARRAY_MAGIC == header->magic, "`array` is not a valid wapp array");
return header->capacity; return header->capacity;
} }
u64 _array_item_size(GenericArray array) { u64 arrayItemSize(WpArray array) {
wapp_debug_assert(array != NULL, "`array` should not be NULL"); wpDebugAssert(array != NULL, "`array` should not be NULL");
ArrayHeader *header = _array_header(array); WpArrayHeader *header = arrayHeader(array);
wapp_runtime_assert(WAPP_ARRAY_MAGIC == header->magic, "`array` is not a valid wapp array"); wpRuntimeAssert(WP_ARRAY_MAGIC == header->magic, "`array` is not a valid wapp array");
return header->item_size; return header->item_size;
} }
void _array_set_count(GenericArray array, u64 count) { void arraySetCount(WpArray array, u64 count) {
wapp_debug_assert(array != NULL, "`array` should not be NULL"); wpDebugAssert(array != NULL, "`array` should not be NULL");
ArrayHeader *header = _array_header(array); WpArrayHeader *header = arrayHeader(array);
wapp_runtime_assert(WAPP_ARRAY_MAGIC == header->magic, "`array` is not a valid wapp array"); wpRuntimeAssert(WP_ARRAY_MAGIC == header->magic, "`array` is not a valid wapp array");
header->count = count; header->count = count;
} }
void *_array_get(GenericArray array, u64 index, u64 item_size) { void *arrayGet(WpArray array, u64 index, u64 item_size) {
wapp_runtime_assert(array != NULL, "`array` should not be NULL"); wpDebugAssert(array != NULL, "`array` should not be NULL");
_array_validate(array, item_size); arrayValidate(array, item_size);
ArrayHeader *header = _array_header(array); WpArrayHeader *header = arrayHeader(array);
wapp_runtime_assert(index < header->count, "`index` is out of bounds"); wpRuntimeAssert(index < header->count, "`index` is out of bounds");
return wapp_pointer_offset(array, header->item_size * index); return arrayGetItemWithOffset(array, header->item_size * index);
} }
void _array_set(GenericArray array, u64 index, void *value, u64 item_size) { void arraySet(WpArray array, u64 index, void *value, u64 item_size) {
void *item = _array_get(array, index, item_size); void *item = arrayGet(array, index, item_size);
ArrayHeader *header = _array_header(array); WpArrayHeader *header = arrayHeader(array);
memcpy(item, value, header->item_size); memcpy(item, value, header->item_size);
} }
void _array_append_capped(GenericArray array, void *value, u64 item_size) { void arrayAppendCapped(WpArray array, void *value, u64 item_size) {
wapp_runtime_assert(array != NULL, "`array` should not be NULL"); wpDebugAssert(array != NULL, "`array` should not be NULL");
_array_validate(array, item_size); arrayValidate(array, item_size);
ArrayHeader *header = _array_header(array); WpArrayHeader *header = arrayHeader(array);
if (header->count >= header->capacity) { return; } if (header->count >= header->capacity) { return; }
u64 index = (header->count)++; u64 index = (header->count)++;
_array_set(array, index, value, item_size); arraySet(array, index, value, item_size);
} }
void _array_extend_capped(GenericArray dst, const GenericArray src, u64 item_size) { void arrayExtendCappend(WpArray dst, const WpArray src, u64 item_size) {
wapp_runtime_assert(dst != NULL && src != NULL, "`dst` and `src` should not be NULL"); wpDebugAssert(dst != NULL && src != NULL, "`dst` and `src` should not be NULL");
_array_validate(dst, item_size); arrayValidate(dst, item_size);
_array_validate(src, item_size); arrayValidate(src, item_size);
ArrayHeader *src_header = _array_header(src); WpArrayHeader *src_header = arrayHeader(src);
ArrayHeader *dst_header = _array_header(dst); WpArrayHeader *dst_header = arrayHeader(dst);
u64 remaining_capacity = dst_header->capacity - dst_header->count; u64 remaining_capacity = dst_header->capacity - dst_header->count;
u64 copy_count = src_header->count < remaining_capacity ? src_header->count : remaining_capacity; u64 copy_count = src_header->count < remaining_capacity ? src_header->count : remaining_capacity;
void *dst_ptr = wapp_pointer_offset(dst, dst_header->count * dst_header->item_size); void *dst_ptr = wpMiscUtilsOffsetPointer(dst, dst_header->count * dst_header->item_size);
memcpy(dst_ptr, src, copy_count * src_header->item_size); memcpy(dst_ptr, src, copy_count * src_header->item_size);
dst_header->count += copy_count; dst_header->count += copy_count;
} }
void _array_copy_capped(GenericArray dst, const GenericArray src, u64 item_size) { void arrayCopyCapped(WpArray dst, const WpArray src, u64 item_size) {
wapp_runtime_assert(dst != NULL && src != NULL, "`dst` and `src` should not be NULL"); wpDebugAssert(dst != NULL && src != NULL, "`dst` and `src` should not be NULL");
_array_validate(dst, item_size); arrayValidate(dst, item_size);
_array_validate(src, item_size); arrayValidate(src, item_size);
_array_clear(dst, item_size); arrayClear(dst, item_size);
ArrayHeader *src_header = _array_header(src); WpArrayHeader *src_header = arrayHeader(src);
ArrayHeader *dst_header = _array_header(dst); WpArrayHeader *dst_header = arrayHeader(dst);
u64 copy_count = src_header->count < dst_header->capacity ? src_header->count : dst_header->capacity; u64 copy_count = src_header->count < dst_header->capacity ? src_header->count : dst_header->capacity;
memcpy((void *)dst, (void *)src, copy_count * src_header->item_size); memcpy((void *)dst, (void *)src, copy_count * src_header->item_size);
dst_header->count = copy_count; dst_header->count = copy_count;
} }
GenericArray _array_append_alloc(const Allocator *allocator, GenericArray array, void *value, WpArray arrayAppendAlloc(const WpAllocator *allocator, WpArray array, void *value,
ArrayInitFlags flags, u64 item_size) { WpArrayInitFlags flags, u64 item_size) {
wapp_runtime_assert(allocator != NULL && array != NULL, "`allocator` and `array` should not be NULL"); wpDebugAssert(allocator != NULL && array != NULL, "`allocator` and `array` should not be NULL");
_array_validate(array, item_size); arrayValidate(array, item_size);
GenericArray output = array; WpArray output = array;
ArrayHeader *header = _array_header(array); WpArrayHeader *header = arrayHeader(array);
if (header->count >= header->capacity) { if (header->count >= header->capacity) {
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(header->capacity * 2); u64 new_capacity = wpMiscUtilsU64RoundUpPow2(header->capacity * 2);
output = (GenericArray )_array_alloc_capacity(allocator, new_capacity, flags, output = (WpArray )arrayAllocCapacity(allocator, new_capacity, flags,
header->item_size); header->item_size);
if (!output) { if (!output) {
output = array; output = array;
goto RETURN_ARRAY_APPEND_ALLOC; goto RETURN_ARRAY_APPEND_ALLOC;
} }
_array_copy_capped(output, array, item_size); arrayCopyCapped(output, array, item_size);
} }
_array_append_capped(output, value, item_size); arrayAppendCapped(output, value, item_size);
if ((flags & ARRAY_INIT_FILLED) == ARRAY_INIT_FILLED) { if ((flags & WP_ARRAY_INIT_FILLED) == WP_ARRAY_INIT_FILLED) {
_array_set_count(output, _array_capacity(output)); arraySetCount(output, arrayCapacity(output));
} }
RETURN_ARRAY_APPEND_ALLOC: RETURN_ARRAY_APPEND_ALLOC:
return output; return output;
} }
GenericArray _array_extend_alloc(const Allocator *allocator, GenericArray dst, const GenericArray src, WpArray arrayExtendAlloc(const WpAllocator *allocator, WpArray dst, const WpArray src,
ArrayInitFlags flags, u64 item_size) { WpArrayInitFlags flags, u64 item_size) {
wapp_runtime_assert(allocator != NULL && dst != NULL && src != NULL, "`allocator`, `dst` and `src` should not be NULL"); wpDebugAssert(allocator != NULL && dst != NULL && src != NULL, "`allocator`, `dst` and `src` should not be NULL");
_array_validate(dst, item_size); arrayValidate(dst, item_size);
_array_validate(src, item_size); arrayValidate(src, item_size);
GenericArray output = dst; WpArray output = dst;
ArrayHeader *src_header = _array_header(src); WpArrayHeader *src_header = arrayHeader(src);
ArrayHeader *dst_header = _array_header(dst); WpArrayHeader *dst_header = arrayHeader(dst);
u64 remaining_capacity = dst_header->capacity - dst_header->count; u64 remaining_capacity = dst_header->capacity - dst_header->count;
if (src_header->count >= remaining_capacity) { if (src_header->count >= remaining_capacity) {
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(dst_header->capacity * 2); u64 new_capacity = wpMiscUtilsU64RoundUpPow2(dst_header->capacity * 2);
output = (GenericArray )_array_alloc_capacity(allocator, new_capacity, output = (WpArray )arrayAllocCapacity(allocator, new_capacity,
flags, dst_header->item_size); flags, dst_header->item_size);
if (!output) { if (!output) {
output = dst; output = dst;
goto RETURN_ARRAY_EXTEND_ALLOC; goto RETURN_ARRAY_EXTEND_ALLOC;
} }
_array_copy_capped(output, dst, item_size); arrayCopyCapped(output, dst, item_size);
} }
_array_extend_capped(output, src, item_size); arrayExtendCappend(output, src, item_size);
if ((flags & ARRAY_INIT_FILLED) == ARRAY_INIT_FILLED) { if ((flags & WP_ARRAY_INIT_FILLED) == WP_ARRAY_INIT_FILLED) {
_array_set_count(output, _array_capacity(output)); arraySetCount(output, arrayCapacity(output));
} }
RETURN_ARRAY_EXTEND_ALLOC: RETURN_ARRAY_EXTEND_ALLOC:
return output; return output;
} }
GenericArray _array_copy_alloc(const Allocator *allocator, GenericArray dst, const GenericArray src, WpArray arrayCopyAlloc(const WpAllocator *allocator, WpArray dst, const WpArray src,
ArrayInitFlags flags, u64 item_size) { WpArrayInitFlags flags, u64 item_size) {
wapp_runtime_assert(allocator != NULL && dst != NULL && src != NULL, "`allocator`, `dst` and `src` should not be NULL"); wpDebugAssert(allocator != NULL && dst != NULL && src != NULL, "`allocator`, `dst` and `src` should not be NULL");
_array_validate(dst, item_size); arrayValidate(dst, item_size);
_array_validate(src, item_size); arrayValidate(src, item_size);
GenericArray output = dst; WpArray output = dst;
ArrayHeader *src_header = _array_header(src); WpArrayHeader *src_header = arrayHeader(src);
ArrayHeader *dst_header = _array_header(dst); WpArrayHeader *dst_header = arrayHeader(dst);
if (src_header->count >= dst_header->capacity) { if (src_header->count >= dst_header->capacity) {
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(dst_header->capacity * 2); u64 new_capacity = wpMiscUtilsU64RoundUpPow2(dst_header->capacity * 2);
output = (GenericArray )_array_alloc_capacity(allocator, new_capacity, output = (WpArray )arrayAllocCapacity(allocator, new_capacity,
flags, src_header->item_size); flags, src_header->item_size);
if (!output) { if (!output) {
output = dst; output = dst;
@@ -185,82 +186,125 @@ GenericArray _array_copy_alloc(const Allocator *allocator, GenericArray dst, con
} }
} }
_array_copy_capped(output, src, item_size); arrayCopyCapped(output, src, item_size);
if ((flags & ARRAY_INIT_FILLED) == ARRAY_INIT_FILLED) { if ((flags & WP_ARRAY_INIT_FILLED) == WP_ARRAY_INIT_FILLED) {
_array_set_count(output, _array_capacity(output)); arraySetCount(output, arrayCapacity(output));
} }
RETURN_ARRAY_COPY_ALLOC: RETURN_ARRAY_COPY_ALLOC:
return output; return output;
} }
void *_array_pop(GenericArray array, u64 item_size) { void arrayRemoveSwapEnd(WpArray array, u64 index, u64 item_size) {
wapp_runtime_assert(array != NULL, "`array` should not be NULL"); wpDebugAssert(array != NULL, "`array` should not be NULL");
_array_validate(array, item_size); arrayValidate(array, item_size);
ArrayHeader *header = _array_header(array); WpArrayHeader *header = arrayHeader(array);
if (header->count == 0 || index > header->count) { return; }
u64 last_item_index = header->count - 1;
if (index < last_item_index) {
void *cur_item = arrayGetItemWithOffset(array, header->item_size * index);
void *last_item = arrayGetItemWithOffset(array, header->item_size * last_item_index);
memcpy(cur_item, last_item, header->item_size);
memset(last_item, 0, header->item_size);
}
--(header->count);
}
void *arrayPop(WpArray array, u64 item_size) {
wpDebugAssert(array != NULL, "`array` should not be NULL");
arrayValidate(array, item_size);
WpArrayHeader *header = arrayHeader(array);
if (header->count == 0) { return NULL; } if (header->count == 0) { return NULL; }
u64 index = header->count - 1; u64 index = header->count - 1;
void *out = _array_get(array, index, item_size); void *out = arrayGetItemWithOffset(array, header->item_size * index);
--(header->count); --(header->count);
return out; return out;
} }
void _array_clear(GenericArray array, u64 item_size) { void arrayZero(WpArray array, u64 item_size) {
wapp_runtime_assert(array != NULL, "`array` should not be NULL"); wpDebugAssert(array != NULL, "`array` should not be NULL");
_array_validate(array, item_size); arrayValidate(array, item_size);
ArrayHeader *header = _array_header(array); WpArrayHeader *header = arrayHeader(array);
memset(array, 0, header->capacity * header->item_size);
}
void arrayClear(WpArray array, u64 item_size) {
wpDebugAssert(array != NULL, "`array` should not be NULL");
arrayValidate(array, item_size);
WpArrayHeader *header = arrayHeader(array);
header->count = 0; header->count = 0;
memset(array, 0, header->capacity * header->item_size);
} }
u64 _array_calc_alloc_size(u64 capacity, u64 item_size) { u64 arrayCalcAllocSize(u64 capacity, u64 item_size) {
return sizeof(ArrayHeader) + item_size * capacity; return sizeof(WpArrayHeader) + item_size * capacity;
} }
GenericArray _array_alloc_capacity(const Allocator *allocator, u64 capacity, ArrayInitFlags flags, WpArray arrayAllocCapacity(const WpAllocator *allocator, u64 capacity, WpArrayInitFlags flags,
u64 item_size) { u64 item_size) {
wapp_runtime_assert(allocator != NULL, "`allocator` should not be NULL"); wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
GenericArray output = NULL; WpArray output = NULL;
u64 allocation_size = _array_calc_alloc_size(capacity, item_size); u64 allocation_size = arrayCalcAllocSize(capacity, item_size);
void *buffer = wapp_mem_allocator_alloc(allocator, allocation_size); void *buffer = wpMemAllocatorAlloc(allocator, allocation_size);
if (!buffer) { if (!buffer) {
goto RETURN_ARRAY_ALLOC; goto RETURN_ARRAY_ALLOC;
} }
output = _array_from_preallocated_buffer(buffer, allocation_size, flags, item_size); output = arrayFromPreallocatedBuffer(buffer, allocation_size, flags, item_size);
RETURN_ARRAY_ALLOC: RETURN_ARRAY_ALLOC:
return output; return output;
} }
GenericArray _array_from_preallocated_buffer(void *buffer, u64 buffer_size, ArrayInitFlags flags, WpArray arrayFromPreallocatedBuffer(void *buffer, u64 buffer_size, WpArrayInitFlags flags,
u64 item_size) { u64 item_size) {
wapp_runtime_assert(buffer != NULL, "`buffer` should not be NULL"); wpDebugAssert(buffer != NULL, "`buffer` should not be NULL");
i64 data_buffer_size = (i64)buffer_size - (i64)(sizeof(ArrayHeader)); i64 data_buffer_size = (i64)buffer_size - (i64)(sizeof(WpArrayHeader));
if (data_buffer_size <= 0) { if (data_buffer_size <= 0) {
return NULL; return NULL;
} }
u64 item_capacity = (u64)data_buffer_size / item_size; u64 item_capacity = (u64)data_buffer_size / item_size;
ArrayHeader *header = (ArrayHeader *)buffer; WpArrayHeader *header = (WpArrayHeader *)buffer;
GenericArray output = (u8 *)(header + 1); WpArray output = (u8 *)(header + 1);
header->magic = WAPP_ARRAY_MAGIC; header->magic = WP_ARRAY_MAGIC;
header->count = flags & ARRAY_INIT_FILLED ? item_capacity : 0; header->count = flags & WP_ARRAY_INIT_FILLED ? item_capacity : 0;
header->capacity = item_capacity; header->capacity = item_capacity;
header->item_size = item_size; header->item_size = item_size;
return output; return output;
} }
wapp_persist inline void _array_validate(const GenericArray array, u64 item_size) { void arrayDealloc(const WpAllocator *allocator, WpArray *array, u64 item_size) {
ArrayHeader *header = _array_header(array); wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
wapp_runtime_assert(WAPP_ARRAY_MAGIC == header->magic, "`array` is not a valid wapp array");
wapp_runtime_assert(item_size == header->item_size, "Invalid item type provided"); u64 capacity = wpArrayCapacity(*array);
u64 allocation_size = arrayCalcAllocSize(capacity, item_size);
void *header = (void *)arrayHeader(*array);
wpMemAllocatorFree(allocator, &header, allocation_size);
*array = NULL;
}
wp_persist inline void arrayValidate(const WpArray array, u64 item_size) {
WpArrayHeader *header = arrayHeader(array);
wpRuntimeAssert(WP_ARRAY_MAGIC == header->magic, "`array` is not a valid wapp array");
wpRuntimeAssert(item_size == header->item_size, "Invalid item type provided");
}
wp_persist inline void *arrayGetItemWithOffset(const WpArray array, u64 offset) {
return wpMiscUtilsOffsetPointer(array, offset);
} }
+153 -146
View File
@@ -8,209 +8,216 @@
#include "../../common/aliases/aliases.h" #include "../../common/aliases/aliases.h"
#include "../../common/platform/platform.h" #include "../../common/platform/platform.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#define WAPP_ARRAY_MAGIC (u64)0x57415f415252 #define WP_ARRAY_MAGIC wpU64Const(0x57415f415252)
#define _calc_array_count(TYPE, ...) wapp_misc_utils_va_args_count(TYPE, __VA_ARGS__) #define calcArrayCount(TYPE, ...) wpMiscUtilsVaArgsCount(TYPE, __VA_ARGS__)
#define _calc_array_capacity(TYPE, ...) wapp_misc_utils_u64_round_up_pow2(_calc_array_count(TYPE, __VA_ARGS__) * 2) #define calcArrayCapacity(TYPE, ...) wpMiscUtilsU64RoundUpPow2(calcArrayCount(TYPE, __VA_ARGS__) * 2)
typedef struct Str8 Str8; typedef struct WpStr8 WpStr8;
// NOTE (Abdelrahman): Typedefs to distinguish arrays from regular pointers // NOTE (Abdelrahman): Typedefs to distinguish arrays from regular pointers
typedef void *GenericArray; typedef void *WpArray;
typedef void **VoidPtrArray; typedef void **WpVoidPtrArray;
typedef c8 *C8Array; typedef c8 *WpC8Array;
typedef c16 *C16Array; typedef c16 *WpC16Array;
typedef c32 *C32Array; typedef c32 *WpC32Array;
typedef u8 *U8Array; typedef u8 *WpU8Array;
typedef u16 *U16Array; typedef u16 *WpU16Array;
typedef u32 *U32Array; typedef u32 *WpU32Array;
typedef u64 *U64Array; typedef u64 *WpU64Array;
typedef b8 *B8Array; typedef b8 *WpB8Array;
typedef i8 *I8Array; typedef i8 *WpI8Array;
typedef i16 *I16Array; typedef i16 *WpI16Array;
typedef i32 *I32Array; typedef i32 *WpI32Array;
typedef i64 *I64Array; typedef i64 *WpI64Array;
typedef f32 *F32Array; typedef f32 *WpF32Array;
typedef f64 *F64Array; typedef f64 *WpF64Array;
typedef f128 *F128Array; typedef f128 *WpF128Array;
typedef uptr *UptrArray; typedef uptr *WpUptrArray;
typedef iptr *IptrArray; typedef iptr *WpIptrArray;
typedef Str8 *Str8Array; typedef WpStr8 *WpStr8Array;
typedef enum { typedef enum WpArrayInitFlags {
ARRAY_INIT_NONE = 0, WP_ARRAY_INIT_NONE = 0,
ARRAY_INIT_FILLED = 1 << 1, WP_ARRAY_INIT_FILLED = 1 << 1,
} ArrayInitFlags; } WpArrayInitFlags;
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
#define wapp_array(TYPE, ...) ([&]() { \ #define wpArray(TYPE, ...) ([&]() { \
u64 capacity = _calc_array_capacity(TYPE, __VA_ARGS__); \ u64 capacity = calcArrayCapacity(TYPE, __VA_ARGS__); \
\ \
TYPE items[_calc_array_capacity(TYPE, __VA_ARGS__)] = {__VA_ARGS__}; \ TYPE items[calcArrayCapacity(TYPE, __VA_ARGS__)] = {__VA_ARGS__}; \
\ \
wapp_persist u8 array[ \ wp_persist u8 array[ \
sizeof(ArrayHeader) + _calc_array_capacity(TYPE, __VA_ARGS__) * sizeof(TYPE) \ sizeof(WpArrayHeader) + calcArrayCapacity(TYPE, __VA_ARGS__) * sizeof(TYPE) \
] = {0}; \ ] = {0}; \
ArrayHeader *header = (ArrayHeader *)array; \ WpArrayHeader *header = (WpArrayHeader *)array; \
header->magic = WAPP_ARRAY_MAGIC; \ header->magic = WP_ARRAY_MAGIC; \
header->count = _calc_array_count(TYPE, __VA_ARGS__); \ header->count = calcArrayCount(TYPE, __VA_ARGS__); \
header->capacity = _calc_array_capacity(TYPE, __VA_ARGS__); \ header->capacity = calcArrayCapacity(TYPE, __VA_ARGS__); \
header->item_size = sizeof(TYPE); \ header->item_size = sizeof(TYPE); \
\ \
u8 *buf = (u8 *)(header + 1); \ u8 *buf = (u8 *)(header + 1); \
memcpy(buf, items, capacity * sizeof(TYPE)); \ memcpy(buf, items, capacity * sizeof(TYPE)); \
return (TYPE *)buf; \ return (TYPE *)buf; \
}()) }())
#define wapp_array_with_capacity(TYPE, CAPACITY, FLAGS) ([&]() { \ #define wpArrayWithCapacity(TYPE, CAPACITY, FLAGS) ([&]() { \
wapp_persist u8 array[ \ wp_persist u8 array[ \
sizeof(ArrayHeader) + CAPACITY * sizeof(TYPE) \ sizeof(WpArrayHeader) + CAPACITY * sizeof(TYPE) \
] = {0}; \ ] = {0}; \
ArrayHeader *header = (ArrayHeader *)array; \ WpArrayHeader *header = (WpArrayHeader *)array; \
header->magic = WAPP_ARRAY_MAGIC; \ header->magic = WP_ARRAY_MAGIC; \
header->count = (FLAGS & ARRAY_INIT_FILLED) ? CAPACITY : 0; \ header->count = (FLAGS & WP_ARRAY_INIT_FILLED) ? CAPACITY : 0; \
header->capacity = CAPACITY; \ header->capacity = CAPACITY; \
header->item_size = sizeof(TYPE); \ header->item_size = sizeof(TYPE); \
\ \
return (TYPE *)(header + 1); \ return (TYPE *)(header + 1); \
}()) }())
#define wapp_array_pop(TYPE, ARRAY) ([&]() { \ #define wpArrayPop(TYPE, ARRAY) ([&]() { \
if (ARRAY == NULL || _array_count((GenericArray)ARRAY) == 0) { \ if (ARRAY == NULL || arrayCount((WpArray)ARRAY) == 0) { \
TYPE result{}; \ TYPE result{}; \
return result; \ return result; \
} \ } \
\ \
return *((TYPE *)_array_pop((GenericArray)ARRAY, sizeof(TYPE))); \ return *((TYPE *)arrayPop((WpArray)ARRAY, sizeof(TYPE))); \
}()) }())
#else #else
#define _stack_array(TYPE, SIZE) struct {ArrayHeader header; \ #define stackArray(TYPE, SIZE) struct {WpArrayHeader header; \
TYPE items[SIZE]; \ TYPE items[SIZE]; \
wapp_misc_utils_reserve_padding(sizeof(ArrayHeader) + \ wpMiscUtilsReservePadding(sizeof(WpArrayHeader) + \
sizeof(TYPE) * SIZE);} sizeof(TYPE) * SIZE);}
#define wapp_array(TYPE, ...) \ #define wpArray(TYPE, ...) \
((TYPE *)( \ ((TYPE *)( \
(_stack_array(TYPE, _calc_array_capacity(TYPE, __VA_ARGS__))){ \ (stackArray(TYPE, calcArrayCapacity(TYPE, __VA_ARGS__))){ \
.header = { \ .header = { \
.magic = WAPP_ARRAY_MAGIC, \ .magic = WP_ARRAY_MAGIC, \
.count = _calc_array_count(TYPE, __VA_ARGS__), \ .count = calcArrayCount(TYPE, __VA_ARGS__), \
.capacity = _calc_array_capacity(TYPE, __VA_ARGS__), \ .capacity = calcArrayCapacity(TYPE, __VA_ARGS__), \
.item_size = sizeof(TYPE), \ .item_size = sizeof(TYPE), \
}, \ }, \
.items = {__VA_ARGS__}, \ .items = {__VA_ARGS__}, \
}.items \ }.items \
)) ))
#define wapp_array_with_capacity(TYPE, CAPACITY, FLAGS) \ #define wpArrayWithCapacity(TYPE, CAPACITY, FLAGS) \
((TYPE *)( \ ((TYPE *)( \
(_stack_array(TYPE, CAPACITY)){ \ (stackArray(TYPE, CAPACITY)){ \
.header = { \ .header = { \
.magic = WAPP_ARRAY_MAGIC, \ .magic = WP_ARRAY_MAGIC, \
.count = (FLAGS & ARRAY_INIT_FILLED) ? CAPACITY : 0, \ .count = (FLAGS & WP_ARRAY_INIT_FILLED) ? CAPACITY : 0, \
.capacity = CAPACITY, \ .capacity = CAPACITY, \
.item_size = sizeof(TYPE), \ .item_size = sizeof(TYPE), \
}, \ }, \
.items = {0}, \ .items = {0}, \
}.items \ }.items \
)) ))
#define wapp_array_pop(TYPE, ARRAY) \ #define wpArrayPop(TYPE, ARRAY) \
(ARRAY == NULL || _array_count((GenericArray)ARRAY) == 0 ? \ (ARRAY == NULL || arrayCount((WpArray)ARRAY) == 0 ? \
(TYPE){0} : \ (TYPE){0} : \
*((TYPE *)_array_pop((GenericArray)ARRAY, sizeof(TYPE))) \ *((TYPE *)arrayPop((WpArray)ARRAY, sizeof(TYPE))) \
) )
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#define wapp_array_count(ARRAY) \ #define wpArrayCount(ARRAY) \
(_array_count((GenericArray)ARRAY)) (arrayCount((WpArray)ARRAY))
#define wapp_array_capacity(ARRAY) \ #define wpArrayCapacity(ARRAY) \
(_array_capacity((GenericArray)ARRAY)) (arrayCapacity((WpArray)ARRAY))
#define wapp_array_item_size(ARRAY) \ #define wpArrayItemSize(ARRAY) \
(_array_item_size((GenericArray)ARRAY)) (arrayItemSize((WpArray)ARRAY))
#define wapp_array_set_count(ARRAY, COUNT) \ #define wpArraySetCount(ARRAY, COUNT) \
(_array_set_count((GenericArray)ARRAY, COUNT)) (arraySetCount((WpArray)ARRAY, COUNT))
#define wapp_array_get(TYPE, ARRAY, INDEX) \ #define wpArrayGet(TYPE, ARRAY, INDEX) \
((TYPE *)_array_get((GenericArray)ARRAY, \ ((TYPE *)arrayGet((WpArray)ARRAY, \
INDEX, \ INDEX, \
sizeof(TYPE)))
#define wpArraySet(TYPE, ARRAY, INDEX, VALUE_PTR) \
(arraySet((WpArray)ARRAY, \
INDEX, \
(u8 *)VALUE_PTR, \
sizeof(TYPE)))
#define wpArrayAppendCapped(TYPE, ARRAY, VALUE_PTR) \
(arrayAppendCapped((WpArray)ARRAY, \
(u8 *)VALUE_PTR, \
sizeof(TYPE)))
#define wpArrayExtendCapped(TYPE, DST_ARRAY, SRC_ARRAY) \
(arrayExtendCappend((WpArray)DST_ARRAY, \
(WpArray)SRC_ARRAY, \
sizeof(TYPE))) sizeof(TYPE)))
#define wapp_array_set(TYPE, ARRAY, INDEX, VALUE_PTR) \ #define wpArrayCopyCapped(TYPE, DST_ARRAY, SRC_ARRAY) \
(_array_set((GenericArray)ARRAY, \ (arrayCopyCapped((WpArray)DST_ARRAY, \
INDEX, \ (WpArray)SRC_ARRAY, \
(u8 *)VALUE_PTR, \ sizeof(TYPE)))
sizeof(TYPE))) #define wpArrayAppendAlloc(TYPE, ALLOCATOR_PTR, ARRAY, VALUE_PTR, FLAGS) \
#define wapp_array_append_capped(TYPE, ARRAY, VALUE_PTR) \ ((TYPE *)arrayAppendAlloc(ALLOCATOR_PTR, \
(_array_append_capped((GenericArray)ARRAY, \ (WpArray)ARRAY, \
(u8 *)VALUE_PTR, \ (u8 *)VALUE_PTR, \
sizeof(TYPE))) FLAGS, \
#define wapp_array_extend_capped(TYPE, DST_ARRAY, SRC_ARRAY) \ sizeof(TYPE)))
(_array_extend_capped((GenericArray)DST_ARRAY, \ #define wpArrayExtendAlloc(TYPE, ALLOCATOR_PTR, DST_ARRAY, SRC_ARRAY, FLAGS) \
(GenericArray)SRC_ARRAY, \ ((TYPE *)arrayExtendAlloc(ALLOCATOR_PTR, \
sizeof(TYPE))) (WpArray)DST_ARRAY, \
#define wapp_array_copy_capped(TYPE, DST_ARRAY, SRC_ARRAY) \ (WpArray)SRC_ARRAY, \
(_array_copy_capped((GenericArray)DST_ARRAY, \ FLAGS, \
(GenericArray)SRC_ARRAY, \ sizeof(TYPE)))
sizeof(TYPE))) #define wpArrayCopyAlloc(TYPE, ALLOCATOR_PTR, DST_ARRAY, SRC_ARRAY, FLAGS) \
#define wapp_array_append_alloc(TYPE, ALLOCATOR_PTR, ARRAY, VALUE_PTR, FLAGS) \ ((TYPE *)arrayCopyAlloc(ALLOCATOR_PTR, \
((TYPE *)_array_append_alloc(ALLOCATOR_PTR, \ (WpArray)DST_ARRAY, \
(GenericArray)ARRAY, \ (WpArray)SRC_ARRAY, \
(u8 *)VALUE_PTR, \ FLAGS, \
FLAGS, \ sizeof(TYPE)))
sizeof(TYPE))) #define wpArrayRemoveSwapEnd(TYPE, ARRAY, INDEX) arrayRemoveSwapEnd(ARRAY, INDEX, sizeof(TYPE))
#define wapp_array_extend_alloc(TYPE, ALLOCATOR_PTR, DST_ARRAY, SRC_ARRAY, FLAGS) \ #define wpArrayZero(TYPE, ARRAY) (arrayZero((WpArray)ARRAY, sizeof(TYPE)))
((TYPE *)_array_extend_alloc(ALLOCATOR_PTR, \ #define wpArrayClear(TYPE, ARRAY) (arrayClear((WpArray)ARRAY, sizeof(TYPE)))
(GenericArray)DST_ARRAY, \ #define wpArrayCalcAllocSize(TYPE, CAPACITY) arrayCalcAllocSize(CAPACITY, sizeof(TYPE))
(GenericArray)SRC_ARRAY, \ #define wpArrayAllocCapacity(TYPE, ALLOCATOR_PTR, CAPACITY, FLAGS) \
FLAGS, \ ((TYPE *)arrayAllocCapacity(ALLOCATOR_PTR, CAPACITY, FLAGS, sizeof(TYPE)))
sizeof(TYPE))) #define wpArrayFromPreallcatedBuffer(TYPE, BUFFER, BUFFER_SIZE) \
#define wapp_array_copy_alloc(TYPE, ALLOCATOR_PTR, DST_ARRAY, SRC_ARRAY, FLAGS) \ ((TYPE *)array_from_preallcated_buffer(BUFFER, BUFFER_SIZE, sizeof(TYPE)))
((TYPE *)_array_copy_alloc(ALLOCATOR_PTR, \ // Only needed for allocators like malloc where each allocation has to be freed on its own.
(GenericArray)DST_ARRAY, \ // No need to use it for allocators like Arena.
(GenericArray)SRC_ARRAY, \ #define wpArrayDealloc(TYPE, ALLOCATOR_PTR, ARRAY_DPTR) \
FLAGS, \ (arrayDealloc(ALLOCATOR_PTR, (WpArray *)ARRAY_DPTR, sizeof(TYPE)))
sizeof(TYPE)))
#define wapp_array_clear(TYPE, ARRAY) \
(_array_clear((GenericArray)ARRAY, \
sizeof(TYPE)))
#define wapp_array_calc_alloc_size(TYPE, CAPACITY) _array_calc_alloc_size(CAPACITY, sizeof(TYPE))
#define wapp_array_alloc_capacity(TYPE, ALLOCATOR_PTR, CAPACITY, FLAGS) \
((TYPE *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, FLAGS, sizeof(TYPE)))
#define wapp_array_from_preallcated_buffer(TYPE, BUFFER, BUFFER_SIZE) \
((TYPE *)_array_from_preallcated_buffer(BUFFER, BUFFER_SIZE, sizeof(TYPE)))
typedef struct header ArrayHeader; typedef struct WpArrayHeader WpArrayHeader;
struct header { struct WpArrayHeader {
u64 magic; u64 magic;
u64 count; u64 count;
u64 capacity; u64 capacity;
u64 item_size; u64 item_size;
}; };
u64 _array_count(GenericArray array); u64 arrayCount(WpArray array);
u64 _array_capacity(GenericArray array); u64 arrayCapacity(WpArray array);
u64 _array_item_size(GenericArray array); u64 arrayItemSize(WpArray array);
void _array_set_count(GenericArray array, u64 count); void arraySetCount(WpArray array, u64 count);
void *_array_get(GenericArray array, u64 index, u64 item_size); void *arrayGet(WpArray array, u64 index, u64 item_size);
void _array_set(GenericArray array, u64 index, void *value, u64 item_size); void arraySet(WpArray array, u64 index, void *value, u64 item_size);
void _array_append_capped(GenericArray array, void *value, u64 item_size); void arrayAppendCapped(WpArray array, void *value, u64 item_size);
void _array_extend_capped(GenericArray dst, const GenericArray src, u64 item_size); void arrayExtendCappend(WpArray dst, const WpArray src, u64 item_size);
void _array_copy_capped(GenericArray dst, const GenericArray src, u64 item_size); void arrayCopyCapped(WpArray dst, const WpArray src, u64 item_size);
GenericArray _array_append_alloc(const Allocator *allocator, GenericArray array, void *value, WpArray arrayAppendAlloc(const WpAllocator *allocator, WpArray array, void *value,
ArrayInitFlags flags, u64 item_size); WpArrayInitFlags flags, u64 item_size);
GenericArray _array_extend_alloc(const Allocator *allocator, GenericArray dst, const GenericArray src, WpArray arrayExtendAlloc(const WpAllocator *allocator, WpArray dst, const WpArray src,
ArrayInitFlags flags, u64 item_size); WpArrayInitFlags flags, u64 item_size);
GenericArray _array_copy_alloc(const Allocator *allocator, GenericArray dst, const GenericArray src, WpArray arrayCopyAlloc(const WpAllocator *allocator, WpArray dst, const WpArray src,
ArrayInitFlags flags, u64 item_size); WpArrayInitFlags flags, u64 item_size);
void *_array_pop(GenericArray array, u64 item_size); void arrayRemoveSwapEnd(WpArray array, u64 index, u64 item_size);
void _array_clear(GenericArray array, u64 item_size); void *arrayPop(WpArray array, u64 item_size);
u64 _array_calc_alloc_size(u64 capacity, u64 item_size); void arrayZero(WpArray array, u64 item_size);
GenericArray _array_alloc_capacity(const Allocator *allocator, u64 capacity, ArrayInitFlags flags, void arrayClear(WpArray array, u64 item_size);
u64 item_size); u64 arrayCalcAllocSize(u64 capacity, u64 item_size);
GenericArray _array_from_preallocated_buffer(void *buffer, u64 buffer_size, ArrayInitFlags flags, WpArray arrayAllocCapacity(const WpAllocator *allocator, u64 capacity, WpArrayInitFlags flags,
u64 item_size); u64 item_size);
WpArray arrayFromPreallocatedBuffer(void *buffer, u64 buffer_size, WpArrayInitFlags flags,
u64 item_size);
void arrayDealloc(const WpAllocator *allocator, WpArray *array, u64 item_size);
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !ARRAY_H #endif // !ARRAY_H
+71 -71
View File
@@ -7,46 +7,46 @@
#include "../../common/platform/platform.h" #include "../../common/platform/platform.h"
#include <stddef.h> #include <stddef.h>
wapp_intern GenericList _node_to_list(GenericNode *node, u64 item_size); wp_intern WpDblList nodeToList(WpDblNode *node, u64 item_size);
wapp_intern inline void _dbl_list_validate(const GenericList *list, u64 item_size); wp_intern inline void dblListValidate(const WpDblList *list, u64 item_size);
wapp_intern inline void _dbl_list_node_validate(const GenericList *list, const GenericNode *node, u64 item_size); wp_intern inline void dblListNodeValidate(const WpDblList *list, const WpDblNode *node, u64 item_size);
GenericList *_dbl_list_alloc(const Allocator *allocator, u64 item_size) { WpDblList *dblListAlloc(const WpAllocator *allocator, u64 item_size) {
wapp_debug_assert(allocator != NULL, "`allocator` should not be NULL"); wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
GenericList *list = wapp_mem_allocator_alloc(allocator, sizeof(GenericList)); WpDblList *list = wpMemAllocatorAlloc(allocator, sizeof(WpDblList));
if (!list) { goto DBL_LIST_ALLOC_RETURN; } if (!list) { goto DBL_LIST_ALLOC_RETURN; }
memset((void *)list, 0, sizeof(GenericList)); memset((void *)list, 0, sizeof(WpDblList));
list->magic = WAPP_DBL_LIST_MAGIC; list->magic = WP_DBL_LIST_MAGIC;
list->item_size = item_size; list->item_size = item_size;
DBL_LIST_ALLOC_RETURN: DBL_LIST_ALLOC_RETURN:
return list; return list;
} }
GenericNode *_dbl_list_node_alloc(const Allocator *allocator, void *item, u64 item_size) { WpDblNode *dblListNodeAlloc(const WpAllocator *allocator, void *item, u64 item_size) {
wapp_debug_assert(allocator != NULL, "`allocator` should not be NULL"); wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
GenericNode *node = wapp_mem_allocator_alloc(allocator, sizeof(GenericNode)); WpDblNode *node = wpMemAllocatorAlloc(allocator, sizeof(WpDblNode));
if (!node) { goto DBL_LIST_NODE_ALLOC_RETURN; } if (!node) { goto DBL_LIST_NODE_ALLOC_RETURN; }
memset((void *)node, 0, sizeof(GenericNode)); memset((void *)node, 0, sizeof(WpDblNode));
node->item = item; node->item = item;
node->header.magic = WAPP_DBL_NODE_MAGIC; node->header.magic = WP_DBL_NODE_MAGIC;
node->header.item_size = item_size; node->header.item_size = item_size;
DBL_LIST_NODE_ALLOC_RETURN: DBL_LIST_NODE_ALLOC_RETURN:
return node; return node;
} }
GenericNode *_dbl_list_get(const GenericList *list, u64 index, u64 item_size) { WpDblNode *dblListGet(const WpDblList *list, u64 index, u64 item_size) {
wapp_debug_assert(list != NULL, "`list` should not be NULL"); wpDebugAssert(list != NULL, "`list` should not be NULL");
_dbl_list_validate(list, item_size); dblListValidate(list, item_size);
wapp_runtime_assert(index < list->node_count, "`index` is out of bounds"); wpRuntimeAssert(index < list->node_count, "`index` is out of bounds");
GenericNode *output = NULL; WpDblNode *output = NULL;
GenericNode *current = list->first; WpDblNode *current = list->first;
for (u64 i = 1; i <= index; ++i) { for (u64 i = 1; i <= index; ++i) {
current = current->header.next; current = current->header.next;
} }
@@ -56,12 +56,12 @@ GenericNode *_dbl_list_get(const GenericList *list, u64 index, u64 item_size) {
return output; return output;
} }
void _dbl_list_push_front(GenericList *list, GenericNode *node, u64 item_size) { void dblListPushFront(WpDblList *list, WpDblNode *node, u64 item_size) {
wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); wpDebugAssert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL");
_dbl_list_validate(list, item_size); dblListValidate(list, item_size);
_dbl_list_node_validate(list, node, item_size); dblListNodeValidate(list, node, item_size);
GenericList node_list = _node_to_list(node, item_size); WpDblList node_list = nodeToList(node, item_size);
if (list->node_count == 0) { if (list->node_count == 0) {
*list = node_list; *list = node_list;
@@ -70,7 +70,7 @@ void _dbl_list_push_front(GenericList *list, GenericNode *node, u64 item_size) {
list->node_count += node_list.node_count; list->node_count += node_list.node_count;
GenericNode *first = list->first; WpDblNode *first = list->first;
if (first) { if (first) {
first->header.prev = node_list.last; first->header.prev = node_list.last;
} }
@@ -79,12 +79,12 @@ void _dbl_list_push_front(GenericList *list, GenericNode *node, u64 item_size) {
node_list.last->header.next = first; node_list.last->header.next = first;
} }
void _dbl_list_push_back(GenericList *list, GenericNode *node, u64 item_size) { void dblListPushBack(WpDblList *list, WpDblNode *node, u64 item_size) {
wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); wpDebugAssert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL");
_dbl_list_validate(list, item_size); dblListValidate(list, item_size);
_dbl_list_node_validate(list, node, item_size); dblListNodeValidate(list, node, item_size);
GenericList node_list = _node_to_list(node, item_size); WpDblList node_list = nodeToList(node, item_size);
if (list->node_count == 0) { if (list->node_count == 0) {
*list = node_list; *list = node_list;
@@ -93,7 +93,7 @@ void _dbl_list_push_back(GenericList *list, GenericNode *node, u64 item_size) {
list->node_count += node_list.node_count; list->node_count += node_list.node_count;
GenericNode *last = list->last; WpDblNode *last = list->last;
if (last) { if (last) {
last->header.next = node_list.first; last->header.next = node_list.first;
} }
@@ -102,29 +102,29 @@ void _dbl_list_push_back(GenericList *list, GenericNode *node, u64 item_size) {
node_list.first->header.prev = last; node_list.first->header.prev = last;
} }
void _dbl_list_insert(GenericList *list, GenericNode *node, u64 index, u64 item_size) { void dblListInsert(WpDblList *list, WpDblNode *node, u64 index, u64 item_size) {
wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL"); wpDebugAssert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL");
_dbl_list_validate(list, item_size); dblListValidate(list, item_size);
_dbl_list_node_validate(list, node, item_size); dblListNodeValidate(list, node, item_size);
if (index == 0) { if (index == 0) {
_dbl_list_push_front(list, node, item_size); dblListPushFront(list, node, item_size);
return; return;
} else if (index == list->node_count) { } else if (index == list->node_count) {
_dbl_list_push_back(list, node, item_size); dblListPushBack(list, node, item_size);
return; return;
} }
GenericNode *dst_node = _dbl_list_get(list, index, item_size); WpDblNode *dst_node = dblListGet(list, index, item_size);
if (!dst_node) { if (!dst_node) {
return; return;
} }
GenericList node_list = _node_to_list(node, item_size); WpDblList node_list = nodeToList(node, item_size);
list->node_count += node_list.node_count; list->node_count += node_list.node_count;
GenericNode *prev = dst_node->header.prev; WpDblNode *prev = dst_node->header.prev;
dst_node->header.prev = node_list.last; dst_node->header.prev = node_list.last;
prev->header.next = node_list.first; prev->header.next = node_list.first;
@@ -133,11 +133,11 @@ void _dbl_list_insert(GenericList *list, GenericNode *node, u64 index, u64 item_
node_list.last->header.next = dst_node; node_list.last->header.next = dst_node;
} }
GenericNode *_dbl_list_pop_front(GenericList *list, u64 item_size) { WpDblNode *dblListPopFront(WpDblList *list, u64 item_size) {
wapp_debug_assert(list != NULL, "`list` should not be NULL"); wpDebugAssert(list != NULL, "`list` should not be NULL");
_dbl_list_validate(list, item_size); dblListValidate(list, item_size);
GenericNode *output = NULL; WpDblNode *output = NULL;
if (list->node_count == 0) { if (list->node_count == 0) {
goto RETURN_LIST_POP_FRONT; goto RETURN_LIST_POP_FRONT;
@@ -146,7 +146,7 @@ GenericNode *_dbl_list_pop_front(GenericList *list, u64 item_size) {
output = list->first; output = list->first;
if (list->node_count == 1) { if (list->node_count == 1) {
*list = (GenericList){.magic = WAPP_DBL_LIST_MAGIC, .item_size = item_size}; *list = (WpDblList){.magic = WP_DBL_LIST_MAGIC, .item_size = item_size};
goto RETURN_LIST_POP_FRONT; goto RETURN_LIST_POP_FRONT;
} }
@@ -159,11 +159,11 @@ RETURN_LIST_POP_FRONT:
return output; return output;
} }
GenericNode *_dbl_list_pop_back(GenericList *list, u64 item_size) { WpDblNode *dblListPopBack(WpDblList *list, u64 item_size) {
wapp_debug_assert(list != NULL, "`list` should not be NULL"); wpDebugAssert(list != NULL, "`list` should not be NULL");
_dbl_list_validate(list, item_size); dblListValidate(list, item_size);
GenericNode *output = NULL; WpDblNode *output = NULL;
if (list->node_count == 0) { if (list->node_count == 0) {
goto RETURN_LIST_POP_BACK; goto RETURN_LIST_POP_BACK;
@@ -172,7 +172,7 @@ GenericNode *_dbl_list_pop_back(GenericList *list, u64 item_size) {
output = list->last; output = list->last;
if (list->node_count == 1) { if (list->node_count == 1) {
*list = (GenericList){.magic = WAPP_DBL_LIST_MAGIC, .item_size = item_size}; *list = (WpDblList){.magic = WP_DBL_LIST_MAGIC, .item_size = item_size};
goto RETURN_LIST_POP_BACK; goto RETURN_LIST_POP_BACK;
} }
@@ -185,21 +185,21 @@ RETURN_LIST_POP_BACK:
return output; return output;
} }
GenericNode *_dbl_list_remove(GenericList *list, u64 index, u64 item_size) { WpDblNode *dblListRemove(WpDblList *list, u64 index, u64 item_size) {
wapp_debug_assert(list != NULL, "`list` should not be NULL"); wpDebugAssert(list != NULL, "`list` should not be NULL");
_dbl_list_validate(list, item_size); dblListValidate(list, item_size);
GenericNode *output = NULL; WpDblNode *output = NULL;
if (index == 0) { if (index == 0) {
output = _dbl_list_pop_front(list, item_size); output = dblListPopFront(list, item_size);
goto RETURN_LIST_REMOVE; goto RETURN_LIST_REMOVE;
} else if (index == list->node_count) { } else if (index == list->node_count) {
output = _dbl_list_pop_back(list, item_size); output = dblListPopBack(list, item_size);
goto RETURN_LIST_REMOVE; goto RETURN_LIST_REMOVE;
} }
output = _dbl_list_get(list, index, item_size); output = dblListGet(list, index, item_size);
if (!output) { if (!output) {
goto RETURN_LIST_REMOVE; goto RETURN_LIST_REMOVE;
} }
@@ -215,19 +215,19 @@ RETURN_LIST_REMOVE:
return output; return output;
} }
void _dbl_list_empty(GenericList *list, u64 item_size) { void dblListEmpty(WpDblList *list, u64 item_size) {
wapp_debug_assert(list != NULL, "`list` should not be NULL"); wpDebugAssert(list != NULL, "`list` should not be NULL");
_dbl_list_validate(list, item_size); dblListValidate(list, item_size);
u64 count = list->node_count; u64 count = list->node_count;
for (u64 i = 0; i < count; ++i) { for (u64 i = 0; i < count; ++i) {
_dbl_list_pop_back(list, item_size); dblListPopBack(list, item_size);
} }
} }
wapp_intern GenericList _node_to_list(GenericNode *node, u64 item_size) { wp_intern WpDblList nodeToList(WpDblNode *node, u64 item_size) {
GenericList output = { WpDblList output = {
.magic = WAPP_DBL_LIST_MAGIC, .magic = WP_DBL_LIST_MAGIC,
.first = node, .first = node,
.last = node, .last = node,
.node_count = 1, .node_count = 1,
@@ -247,13 +247,13 @@ wapp_intern GenericList _node_to_list(GenericNode *node, u64 item_size) {
return output; return output;
} }
wapp_intern inline void _dbl_list_validate(const GenericList *list, u64 item_size) { wp_intern inline void dblListValidate(const WpDblList *list, u64 item_size) {
wapp_runtime_assert(list->magic == WAPP_DBL_LIST_MAGIC, "`list` isn't a valid wapp list type"); wpRuntimeAssert(list->magic == WP_DBL_LIST_MAGIC, "`list` isn't a valid wp list type");
wapp_runtime_assert(list->item_size == item_size, "Invalid item provided"); wpRuntimeAssert(list->item_size == item_size, "Invalid item provided");
} }
wapp_intern inline void _dbl_list_node_validate(const GenericList *list, const GenericNode *node, u64 item_size) { wp_intern inline void dblListNodeValidate(const WpDblList *list, const WpDblNode *node, u64 item_size) {
wapp_runtime_assert(node->header.magic == WAPP_DBL_NODE_MAGIC, "`node` isn't a valid wapp node type"); wpRuntimeAssert(node->header.magic == WP_DBL_NODE_MAGIC, "`node` isn't a valid wp node type");
wapp_runtime_assert(list->item_size == node->header.item_size, "Mismatched `list` and `node` types"); wpRuntimeAssert(list->item_size == node->header.item_size, "Mismatched `list` and `node` types");
wapp_runtime_assert(node->header.item_size == item_size, "Invalid item provided"); wpRuntimeAssert(node->header.item_size == item_size, "Invalid item provided");
} }
+111 -111
View File
@@ -7,178 +7,178 @@
#include "../../common/aliases/aliases.h" #include "../../common/aliases/aliases.h"
#include "../../common/platform/platform.h" #include "../../common/platform/platform.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#define WAPP_DBL_LIST_MAGIC (u64)0x57415f444c5354 #define WP_DBL_LIST_MAGIC wpU64Const(0x57415f444c5354)
#define WAPP_DBL_NODE_MAGIC (u64)0x57415f444e44 #define WP_DBL_NODE_MAGIC wpU64Const(0x57415f444e44)
typedef struct GenericNode GenericNode; typedef struct WpDblNode WpDblNode;
typedef struct { typedef struct WpDblNodeHeader {
u64 magic; u64 magic;
u64 item_size; u64 item_size;
GenericNode *prev; WpDblNode *prev;
GenericNode *next; WpDblNode *next;
} NodeHeader; } WpDblNodeHeader;
struct GenericNode { struct WpDblNode {
NodeHeader header; WpDblNodeHeader header;
void *item; void *item;
}; };
typedef struct { typedef struct WpDblList {
u64 magic; u64 magic;
u64 node_count; u64 node_count;
u64 item_size; u64 item_size;
GenericNode *first; WpDblNode *first;
GenericNode *last; WpDblNode *last;
} GenericList; } WpDblList;
// NOTE (Abdelrahman): GenericList typedefs for readability // NOTE (Abdelrahman): WpDblList typedefs for readability
typedef GenericList VoidPtrList; typedef WpDblList WpVoidPtrList;
typedef GenericList C8List; typedef WpDblList WpC8List;
typedef GenericList C16List; typedef WpDblList WpC16List;
typedef GenericList C32List; typedef WpDblList WpC32List;
typedef GenericList U8List; typedef WpDblList WpU8List;
typedef GenericList U16List; typedef WpDblList WpU16List;
typedef GenericList U32List; typedef WpDblList WpU32List;
typedef GenericList U64List; typedef WpDblList WpU64List;
typedef GenericList B8List; typedef WpDblList WpB8List;
typedef GenericList I8List; typedef WpDblList WpI8List;
typedef GenericList I16List; typedef WpDblList WpI16List;
typedef GenericList I32List; typedef WpDblList WpI32List;
typedef GenericList I64List; typedef WpDblList WpI64List;
typedef GenericList F32List; typedef WpDblList WpF32List;
typedef GenericList F64List; typedef WpDblList WpF64List;
typedef GenericList F128List; typedef WpDblList WpF128List;
typedef GenericList UptrList; typedef WpDblList WpUptrList;
typedef GenericList IptrList; typedef WpDblList WpIptrList;
typedef GenericList Str8List; typedef WpDblList WpStr8List;
// NOTE (Abdelrahman): GenericNode typedefs for readability // NOTE (Abdelrahman): WpDblNode typedefs for readability
typedef GenericNode VoidPtrNode; typedef WpDblNode WpVoidPtrNode;
typedef GenericNode C8Node; typedef WpDblNode WpC8Node;
typedef GenericNode C16Node; typedef WpDblNode WpC16Node;
typedef GenericNode C32Node; typedef WpDblNode WpC32Node;
typedef GenericNode U8Node; typedef WpDblNode WpU8Node;
typedef GenericNode U16Node; typedef WpDblNode WpU16Node;
typedef GenericNode U32Node; typedef WpDblNode WpU32Node;
typedef GenericNode U64Node; typedef WpDblNode WpU64Node;
typedef GenericNode B8Node; typedef WpDblNode WpB8Node;
typedef GenericNode I8Node; typedef WpDblNode WpI8Node;
typedef GenericNode I16Node; typedef WpDblNode WpI16Node;
typedef GenericNode I32Node; typedef WpDblNode WpI32Node;
typedef GenericNode I64Node; typedef WpDblNode WpI64Node;
typedef GenericNode F32Node; typedef WpDblNode WpF32Node;
typedef GenericNode F64Node; typedef WpDblNode WpF64Node;
typedef GenericNode F128Node; typedef WpDblNode WpF128Node;
typedef GenericNode UptrNode; typedef WpDblNode WpUptrNode;
typedef GenericNode IptrNode; typedef WpDblNode WpIptrNode;
typedef GenericNode Str8Node; typedef WpDblNode WpStr8Node;
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
#define wapp_dbl_list(TYPE) \ #define wpDblList(TYPE) \
GenericList{WAPP_DBL_LIST_MAGIC, 0, sizeof(TYPE), nullptr, nullptr} WpDblList{WP_DBL_LIST_MAGIC, 0, sizeof(TYPE), nullptr, nullptr}
#define _dbl_list_node(TYPE, ITEM_PTR) ([&]() { \ #define dblListNode(TYPE, ITEM_PTR) ([&]() { \
wapp_persist GenericNode node = { \ wp_persist WpDblNode node = { \
NodeHeader{WAPP_DBL_NODE_MAGIC, sizeof(TYPE), nullptr, nullptr}, \ WpDblNodeHeader{WP_DBL_NODE_MAGIC, sizeof(TYPE), nullptr, nullptr}, \
ITEM_PTR, \ ITEM_PTR, \
}; \ }; \
\ \
return &node; \ return &node; \
}()) }())
#else #else
#define wapp_dbl_list(TYPE) ( \ #define wpDblList(TYPE) ( \
(GenericList){.magic = WAPP_DBL_LIST_MAGIC, .item_size = sizeof(TYPE)} \ (WpDblList){.magic = WP_DBL_LIST_MAGIC, .item_size = sizeof(TYPE)} \
) )
#define _dbl_list_node(TYPE, ITEM_PTR) ( \ #define dblListNode(TYPE, ITEM_PTR) ( \
&((GenericNode){.header = {.magic = WAPP_DBL_NODE_MAGIC, .item_size = sizeof(TYPE)}, \ &((WpDblNode){.header = {.magic = WP_DBL_NODE_MAGIC, .item_size = sizeof(TYPE)}, \
.item = ITEM_PTR}) \ .item = ITEM_PTR}) \
) )
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#define wapp_dbl_list_alloc(TYPE, ALLOCATOR) \ #define wpDblListAlloc(TYPE, ALLOCATOR) \
(_dbl_list_alloc(ALLOCATOR, sizeof(TYPE))) (dblListAlloc(ALLOCATOR, sizeof(TYPE)))
#define wapp_dbl_list_get(TYPE, LIST_PTR, ITEM_INDEX) \ #define wpDblListGet(TYPE, LIST_PTR, ITEM_INDEX) \
((TYPE *)(_dbl_list_get(LIST_PTR, ITEM_INDEX, sizeof(TYPE))->item)) ((TYPE *)(dblListGet(LIST_PTR, ITEM_INDEX, sizeof(TYPE))->item))
#define wapp_dbl_list_get_node(TYPE, LIST_PTR, ITEM_INDEX) \ #define wpDblListGetNode(TYPE, LIST_PTR, ITEM_INDEX) \
(_dbl_list_get(LIST_PTR, ITEM_INDEX, sizeof(TYPE))) (dblListGet(LIST_PTR, ITEM_INDEX, sizeof(TYPE)))
#define wapp_dbl_list_get_node_item(TYPE, NODE_PTR) \ #define wpDblListGetNodeItem(TYPE, NODE_PTR) \
((TYPE *)( \ ((TYPE *)( \
(NODE_PTR == NULL) ? \ (NODE_PTR == NULL) ? \
NULL : \ NULL : \
(NODE_PTR)->item \ (NODE_PTR)->item \
)) ))
#define wapp_dbl_list_push_front(TYPE, LIST_PTR, ITEM_PTR) \ #define wpDblListPushFront(TYPE, LIST_PTR, ITEM_PTR) \
(_dbl_list_push_front(LIST_PTR, _dbl_list_node(TYPE, ITEM_PTR), sizeof(TYPE))) (dblListPushFront(LIST_PTR, dblListNode(TYPE, ITEM_PTR), sizeof(TYPE)))
#define wapp_dbl_list_push_back(TYPE, LIST_PTR, ITEM_PTR) \ #define wpDblListPushBack(TYPE, LIST_PTR, ITEM_PTR) \
(_dbl_list_push_back(LIST_PTR, _dbl_list_node(TYPE, ITEM_PTR), sizeof(TYPE))) (dblListPushBack(LIST_PTR, dblListNode(TYPE, ITEM_PTR), sizeof(TYPE)))
#define wapp_dbl_list_insert(TYPE, LIST_PTR, ITEM_PTR, ITEM_INDEX) \ #define wpDblListInsert(TYPE, LIST_PTR, ITEM_PTR, ITEM_INDEX) \
(_dbl_list_insert(LIST_PTR, _dbl_list_node(TYPE, ITEM_PTR), \ (dblListInsert(LIST_PTR, dblListNode(TYPE, ITEM_PTR), \
ITEM_INDEX, sizeof(TYPE))) ITEM_INDEX, sizeof(TYPE)))
#define wapp_dbl_list_push_front_alloc(TYPE, ALLOCATOR, LIST_PTR, ITEM_PTR) \ #define wpDblListPushFrontAlloc(TYPE, ALLOCATOR, LIST_PTR, ITEM_PTR) \
(_dbl_list_push_front(LIST_PTR, _dbl_list_node_alloc(ALLOCATOR, ITEM_PTR, sizeof(TYPE)), \ (dblListPushFront(LIST_PTR, dblListNodeAlloc(ALLOCATOR, ITEM_PTR, sizeof(TYPE)), \
sizeof(TYPE))) sizeof(TYPE)))
#define wapp_dbl_list_push_back_alloc(TYPE, ALLOCATOR, LIST_PTR, ITEM_PTR) \ #define wpDblListPushBackAlloc(TYPE, ALLOCATOR, LIST_PTR, ITEM_PTR) \
(_dbl_list_push_back(LIST_PTR, _dbl_list_node_alloc(ALLOCATOR, ITEM_PTR, sizeof(TYPE)), \ (dblListPushBack(LIST_PTR, dblListNodeAlloc(ALLOCATOR, ITEM_PTR, sizeof(TYPE)), \
sizeof(TYPE))) sizeof(TYPE)))
#define wapp_dbl_list_insert_alloc(TYPE, ALLOCATOR, LIST_PTR, ITEM_PTR, ITEM_INDEX) \ #define wpDblListInsertAlloc(TYPE, ALLOCATOR, LIST_PTR, ITEM_PTR, ITEM_INDEX) \
(_dbl_list_insert(LIST_PTR, _dbl_list_node_alloc(ALLOCATOR, ITEM_PTR, sizeof(TYPE)), \ (dblListInsert(LIST_PTR, dblListNodeAlloc(ALLOCATOR, ITEM_PTR, sizeof(TYPE)), \
ITEM_INDEX, sizeof(TYPE))) ITEM_INDEX, sizeof(TYPE)))
#define wapp_dbl_list_pop_front(TYPE, LIST_PTR) \ #define wpDblListPopFront(TYPE, LIST_PTR) \
((TYPE *)( \ ((TYPE *)( \
(LIST_PTR == NULL || (LIST_PTR)->node_count == 0) ? \ (LIST_PTR == NULL || (LIST_PTR)->node_count == 0) ? \
NULL : \ NULL : \
_dbl_list_pop_front(LIST_PTR, sizeof(TYPE))->item \ dblListPopFront(LIST_PTR, sizeof(TYPE))->item \
)) ))
#define wapp_dbl_list_pop_back(TYPE, LIST_PTR) \ #define wpDblListPopBack(TYPE, LIST_PTR) \
((TYPE *)( \ ((TYPE *)( \
(LIST_PTR == NULL || (LIST_PTR)->node_count == 0) ? \ (LIST_PTR == NULL || (LIST_PTR)->node_count == 0) ? \
NULL : \ NULL : \
_dbl_list_pop_back(LIST_PTR, sizeof(TYPE))->item \ dblListPopBack(LIST_PTR, sizeof(TYPE))->item \
)) ))
#define wapp_dbl_list_remove(TYPE, LIST_PTR, ITEM_INDEX) \ #define wpDblListRemove(TYPE, LIST_PTR, ITEM_INDEX) \
((TYPE *)( \ ((TYPE *)( \
(LIST_PTR == NULL || (LIST_PTR)->node_count == 0 || ITEM_INDEX >= (LIST_PTR)->node_count) ? \ (LIST_PTR == NULL || (LIST_PTR)->node_count == 0 || ITEM_INDEX >= (LIST_PTR)->node_count) ? \
NULL : \ NULL : \
_dbl_list_remove(LIST_PTR, ITEM_INDEX, sizeof(TYPE))->item \ dblListRemove(LIST_PTR, ITEM_INDEX, sizeof(TYPE))->item \
)) ))
#define wapp_dbl_list_pop_front_node(TYPE, LIST_PTR) \ #define wpDblListPopFrontNode(TYPE, LIST_PTR) \
( \ ( \
(LIST_PTR == NULL || (LIST_PTR)->node_count == 0) ? \ (LIST_PTR == NULL || (LIST_PTR)->node_count == 0) ? \
NULL : \ NULL : \
_dbl_list_pop_front(LIST_PTR, sizeof(TYPE)) \ dblListPopFront(LIST_PTR, sizeof(TYPE)) \
) )
#define wapp_dbl_list_pop_back_node(TYPE, LIST_PTR) \ #define wpDblListPopBackNode(TYPE, LIST_PTR) \
( \ ( \
(LIST_PTR == NULL || (LIST_PTR)->node_count == 0) ? \ (LIST_PTR == NULL || (LIST_PTR)->node_count == 0) ? \
NULL : \ NULL : \
_dbl_list_pop_back(LIST_PTR, sizeof(TYPE)) \ dblListPopBack(LIST_PTR, sizeof(TYPE)) \
) )
#define wapp_dbl_list_remove_node(TYPE, LIST_PTR, ITEM_INDEX) \ #define wpDblListRemoveNode(TYPE, LIST_PTR, ITEM_INDEX) \
( \ ( \
(LIST_PTR == NULL || (LIST_PTR)->node_count == 0 || ITEM_INDEX >= (LIST_PTR)->node_count) ? \ (LIST_PTR == NULL || (LIST_PTR)->node_count == 0 || ITEM_INDEX >= (LIST_PTR)->node_count) ? \
NULL : \ NULL : \
_dbl_list_remove(LIST_PTR, ITEM_INDEX, sizeof(TYPE)) \ dblListRemove(LIST_PTR, ITEM_INDEX, sizeof(TYPE)) \
) )
#define wapp_dbl_list_empty(TYPE, LIST_PTR) \ #define wpDblListEmpty(TYPE, LIST_PTR) \
(_dbl_list_empty(LIST_PTR, sizeof(TYPE))) (dblListEmpty(LIST_PTR, sizeof(TYPE)))
GenericList *_dbl_list_alloc(const Allocator *allocator, u64 item_size); WpDblList *dblListAlloc(const WpAllocator *allocator, u64 item_size);
GenericNode *_dbl_list_node_alloc(const Allocator *allocator, void *item, u64 item_size); WpDblNode *dblListNodeAlloc(const WpAllocator *allocator, void *item, u64 item_size);
GenericNode *_dbl_list_get(const GenericList *list, u64 index, u64 item_size); WpDblNode *dblListGet(const WpDblList *list, u64 index, u64 item_size);
void _dbl_list_push_front(GenericList *list, GenericNode *node, u64 item_size); void dblListPushFront(WpDblList *list, WpDblNode *node, u64 item_size);
void _dbl_list_push_back(GenericList *list, GenericNode *node, u64 item_size); void dblListPushBack(WpDblList *list, WpDblNode *node, u64 item_size);
void _dbl_list_insert(GenericList *list, GenericNode *node, u64 index, u64 item_size); void dblListInsert(WpDblList *list, WpDblNode *node, u64 index, u64 item_size);
GenericNode *_dbl_list_pop_front(GenericList *list, u64 item_size); WpDblNode *dblListPopFront(WpDblList *list, u64 item_size);
GenericNode *_dbl_list_pop_back(GenericList *list, u64 item_size); WpDblNode *dblListPopBack(WpDblList *list, u64 item_size);
GenericNode *_dbl_list_remove(GenericList *list, u64 index, u64 item_size); WpDblNode *dblListRemove(WpDblList *list, u64 index, u64 item_size);
void _dbl_list_empty(GenericList *list, u64 item_size); void dblListEmpty(WpDblList *list, u64 item_size);
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !DBL_LIST_H #endif // !DBL_LIST_H
+25
View File
@@ -0,0 +1,25 @@
// vim:fileencoding=utf-8:foldmethod=marker
#include "hasher.h"
#include "../../../common/assert/assert.h"
WpHasher wpCustomHasher(WpHashFunc func, void *ctx) {
return (WpHasher){
.func = func,
.ctx = (WpHasherCtx){
.type = WP_HASHER_CTX_USER_DEFINED,
.user = ctx,
}
};
}
WpU128 wpHasherGetHash128(const WpHasher *hasher, WpU8Stream *stream) {
wpDebugAssert(hasher != NULL && stream != NULL, "hasher and stream shouldn't be NULL");
return hasher->func(stream, hasher->ctx);
}
u64 wpHasherGetHash64(const WpHasher *hasher, WpU8Stream *stream) {
wpDebugAssert(hasher != NULL && stream != NULL, "hasher and stream shouldn't be NULL");
WpU128 result = hasher->func(stream, hasher->ctx);
return result.value[0] ^ result.value[1];
}
+55
View File
@@ -0,0 +1,55 @@
// vim:fileencoding=utf-8:foldmethod=marker
#ifndef HASHER_H
#define HASHER_H
#include "../../stream/stream.h"
#include "../../../common/aliases/aliases.h"
#ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE
#endif // !WP_PLATFORM_CPP
typedef struct WpU128 {
u64 value[2];
} WpU128;
typedef enum WpHasherCtxType {
WP_HASHER_CTX_MURMUR3,
WP_HASHER_CTX_SIPHASH,
WP_HASHER_CTX_USER_DEFINED,
COUNT_HASHER_CTX,
} WpHasherCtxType;
typedef struct WpSiphashCtx {
WpU128 key;
u64 compression;
u64 finalisation;
} WpSiphashCtx;
typedef struct WpHasherCtx {
WpHasherCtxType type;
union {
WpSiphashCtx siphash;
void *user;
u32 murmur3;
};
} WpHasherCtx;
typedef WpU128 (*WpHashFunc)(WpU8Stream *stream, WpHasherCtx ctx);
typedef struct WpHasher {
WpHashFunc func;
WpHasherCtx ctx;
} WpHasher;
WpHasher wpCustomHasher(WpHashFunc func, void *ctx);
WpU128 wpHasherGetHash128(const WpHasher *hasher, WpU8Stream *stream);
u64 wpHasherGetHash64(const WpHasher *hasher, WpU8Stream *stream);
#ifdef WP_PLATFORM_CPP
END_C_LINKAGE
#endif // !WP_PLATFORM_CPP
#endif // !HASHER_H
+126
View File
@@ -0,0 +1,126 @@
// vim:fileencoding=utf-8:foldmethod=marker
#include "murmur3.h"
#include "hasher.h"
#include "../../../common/aliases/aliases.h"
#include "../../../common/assert/assert.h"
#include "../../../common/misc/misc_utils.h"
#include "../../../prng/xorshift/xorshift.h"
wp_intern inline void validateMur3HasherCtx(const WpHasherCtx *ctx);
wp_intern inline u64 fmix64(u64 k);
WpHasher wpX64Mur3Hasher(void) {
WpXor256State state = wpPrngXorshiftInit();
u32 seed = (u32)wpPrngXorshift256(&state);
return wpX64Mur3HasherWithSeed(seed);
}
WpHasher wpX64Mur3HasherWithSeed(u32 seed) {
return (WpHasher){
.func = wpX64Mur3GetHash128,
.ctx = (WpHasherCtx){
.type = WP_HASHER_CTX_MURMUR3,
.murmur3 = seed,
},
};
}
WpU128 wpX64Mur3GetHash128(WpU8Stream *bytes, WpHasherCtx ctx) {
validateMur3HasherCtx(&ctx);
const i32 nblocks = (bytes->count * bytes->item_size) / 16;
u64 h1 = ctx.murmur3;
u64 h2 = ctx.murmur3;
const u64 c1 = wpU64Const(0x87c37b91114253d5);
const u64 c2 = wpU64Const(0x4cf5ad432745937f);
//----------
// body
for(int i = 0; i < nblocks; ++i) {
u64 k1 = *((u64 *)wpStreamConsumeCount(u8, bytes, sizeof(u64)));
u64 k2 = *((u64 *)wpStreamConsumeCount(u8, bytes, sizeof(u64)));
k1 *= c1;
k1 = wpMiscUtilsRotl64(k1, 31);
k1 *= c2;
h1 ^= k1;
h1 = wpMiscUtilsRotl64(h1, 27);
h1 += h2;
h1 = h1 * 5 +0x52dce729;
k2 *= c2;
k2 = wpMiscUtilsRotl64(k2, 33);
k2 *= c1;
h2 ^= k2;
h2 = wpMiscUtilsRotl64(h2, 31);
h2 += h1;
h2 = h2*5+0x38495ab5;
}
//----------
// tail
const u8 *tail = wpStreamConsumeCount(u8, bytes, bytes->count - bytes->position);
u64 k1 = 0;
u64 k2 = 0;
u64 len = bytes->count * bytes->item_size;
switch(len & 15) {
case 15: k2 ^= ((u64)tail[14]) << 48;
case 14: k2 ^= ((u64)tail[13]) << 40;
case 13: k2 ^= ((u64)tail[12]) << 32;
case 12: k2 ^= ((u64)tail[11]) << 24;
case 11: k2 ^= ((u64)tail[10]) << 16;
case 10: k2 ^= ((u64)tail[ 9]) << 8;
case 9: k2 ^= ((u64)tail[ 8]) << 0;
k2 *= c2; k2 = wpMiscUtilsRotl64(k2,33); k2 *= c1; h2 ^= k2;
case 8: k1 ^= ((u64)tail[ 7]) << 56;
case 7: k1 ^= ((u64)tail[ 6]) << 48;
case 6: k1 ^= ((u64)tail[ 5]) << 40;
case 5: k1 ^= ((u64)tail[ 4]) << 32;
case 4: k1 ^= ((u64)tail[ 3]) << 24;
case 3: k1 ^= ((u64)tail[ 2]) << 16;
case 2: k1 ^= ((u64)tail[ 1]) << 8;
case 1: k1 ^= ((u64)tail[ 0]) << 0;
k1 *= c1; k1 = wpMiscUtilsRotl64(k1,31); k1 *= c2; h1 ^= k1;
};
//----------
// finalization
h1 ^= len; h2 ^= len;
h1 += h2;
h2 += h1;
h1 = fmix64(h1);
h2 = fmix64(h2);
h1 += h2;
h2 += h1;
return (WpU128){ .value = { [0] = h1, [1] = h2 } };
}
wp_intern inline void validateMur3HasherCtx(const WpHasherCtx *ctx) {
wpRuntimeAssert(ctx->type == WP_HASHER_CTX_MURMUR3, "Invalid Murmur3 hash context");
}
wp_intern inline u64 fmix64(u64 k) {
k ^= k >> 33;
k *= wpU64Const(0xff51afd7ed558ccd);
k ^= k >> 33;
k *= wpU64Const(0xc4ceb9fe1a85ec53);
k ^= k >> 33;
return k;
}
+28
View File
@@ -0,0 +1,28 @@
// vim:fileencoding=utf-8:foldmethod=marker
/**
* An implementation of the x64 128-bit variant of the MurmurHash3 algorithm
* based on https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp
*/
#ifndef MURMUR3_H
#define MURMUR3_H
#include "hasher.h"
#include "../../stream/stream.h"
#include "../../../common/aliases/aliases.h"
#include "../../../common/platform/platform.h"
#ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE
#endif // !WP_PLATFORM_CPP
WpHasher wpX64Mur3Hasher(void);
WpHasher wpX64Mur3HasherWithSeed(u32 seed);
WpU128 wpX64Mur3GetHash128(WpU8Stream *bytes, WpHasherCtx ctx);
#ifdef WP_PLATFORM_CPP
END_C_LINKAGE
#endif // !WP_PLATFORM_CPP
#endif // !MURMUR3_H
+190
View File
@@ -0,0 +1,190 @@
// vim:fileencoding=utf-8:foldmethod=marker
#include "siphash.h"
#include "hasher.h"
#include "../../../common/aliases/aliases.h"
#include "../../../common/assert/assert.h"
#include "../../../common/misc/misc_utils.h"
#include "../../../prng/xorshift/xorshift.h"
wp_intern inline void siphash(WpStream *bytes, const WpHasherCtx *ctx, u8 *out, u64 outlen);
wp_intern inline void validateSipHasherCtx(const WpHasherCtx *ctx);
wp_intern inline b8 checkRounds(const WpHasherCtx *ctx);
#define _u32To8LE(p, v) \
(p)[0] = (u8)((v)); \
(p)[1] = (u8)((v) >> 8); \
(p)[2] = (u8)((v) >> 16); \
(p)[3] = (u8)((v) >> 24);
#define _u64To8LE(p, v) \
_u32To8LE((p), (u32)((v))); \
_u32To8LE((p) + 4, (u32)((v) >> 32));
#define _u8To64LE(p) \
(((u64)((p)[0])) | ((u64)((p)[1]) << 8) | \
((u64)((p)[2]) << 16) | ((u64)((p)[3]) << 24) | \
((u64)((p)[4]) << 32) | ((u64)((p)[5]) << 40) | \
((u64)((p)[6]) << 48) | ((u64)((p)[7]) << 56))
#define _sipRound \
do { \
v0 += v1; \
v1 = wpMiscUtilsRotl64(v1, 13); \
v1 ^= v0; \
v0 = wpMiscUtilsRotl64(v0, 32); \
v2 += v3; \
v3 = wpMiscUtilsRotl64(v3, 16); \
v3 ^= v2; \
v0 += v3; \
v3 = wpMiscUtilsRotl64(v3, 21); \
v3 ^= v0; \
v2 += v1; \
v1 = wpMiscUtilsRotl64(v1, 17); \
v1 ^= v2; \
v2 = wpMiscUtilsRotl64(v2, 32); \
} while (0)
WpHasher wpSip24Hasher(void) {
WpXor256State state = wpPrngXorshiftInit();
WpU128 key = { .value = { wpPrngXorshift256(&state), wpPrngXorshift256(&state) } };
return wpSip24HasherWithKey(key);
}
WpHasher wpSip48Hasher(void) {
WpXor256State state = wpPrngXorshiftInit();
WpU128 key = { .value = { wpPrngXorshift256(&state), wpPrngXorshift256(&state) } };
return wpSip48HasherWithKey(key);
}
WpHasher wpSip24HasherWithKey(WpU128 key) {
return (WpHasher){
.func = wpSipGetHash128,
.ctx = (WpHasherCtx){
.type = WP_HASHER_CTX_SIPHASH,
.siphash = (WpSiphashCtx){ .key = key, .compression = 2, .finalisation = 4 },
},
};
}
WpHasher wpSip48HasherWithKey(WpU128 key) {
return (WpHasher){
.func = wpSipGetHash128,
.ctx = (WpHasherCtx){
.type = WP_HASHER_CTX_SIPHASH,
.siphash = (WpSiphashCtx){ .key = key, .compression = 4, .finalisation = 8 },
},
};
}
WpU128 wpSipGetHash128(WpStream *bytes, WpHasherCtx ctx) {
validateSipHasherCtx(&ctx);
WpU128 output = {0};
siphash(bytes, &ctx, (u8 *)&output.value, sizeof(u64) * 2);
return output;
}
/**
* Implementation of the 128-variant of the siphash algorithm
*/
wp_intern inline void siphash(WpStream *bytes, const WpHasherCtx *ctx, u8 *out, u64 outlen) {
const u8 *kk = (const u8 *)&ctx->siphash.key;
u64 inlen = bytes->count * bytes->item_size;
wpRuntimeAssert(outlen == 16, "outlen should be 16");
u64 v0 = wpU64Const(0x736f6d6570736575);
u64 v1 = wpU64Const(0x646f72616e646f6d);
u64 v2 = wpU64Const(0x6c7967656e657261);
u64 v3 = wpU64Const(0x7465646279746573);
u64 k0 = _u8To64LE(kk);
u64 k1 = _u8To64LE(kk + 8);
u64 m;
u64 i;
const i32 left = inlen & 7;
u64 b = ((u64)inlen) << 56;
v3 ^= k1;
v2 ^= k0;
v1 ^= k1;
v0 ^= k0;
v1 ^= 0xee;
u8 *data;
while (wpStreamHasCount(bytes, sizeof(u64))) {
data = wpStreamConsumeCount(u8, bytes, sizeof(u64));
m = _u8To64LE(data);
v3 ^= m;
for (i = 0; i < ctx->siphash.compression; ++i) {
_sipRound;
}
v0 ^= m;
}
data = wpStreamConsume(u8, bytes);
switch (left) {
case 7:
b |= ((u64)data[6]) << 48;
/* FALLTHRU */
case 6:
b |= ((u64)data[5]) << 40;
/* FALLTHRU */
case 5:
b |= ((u64)data[4]) << 32;
/* FALLTHRU */
case 4:
b |= ((u64)data[3]) << 24;
/* FALLTHRU */
case 3:
b |= ((u64)data[2]) << 16;
/* FALLTHRU */
case 2:
b |= ((u64)data[1]) << 8;
/* FALLTHRU */
case 1:
b |= ((u64)data[0]);
break;
case 0:
break;
}
v3 ^= b;
for (i = 0; i < ctx->siphash.compression; ++i) {
_sipRound;
}
v0 ^= b;
v2 ^= 0xee;
for (i = 0; i < ctx->siphash.finalisation; ++i) {
_sipRound;
}
b = v0 ^ v1 ^ v2 ^ v3;
_u64To8LE(out, b);
v1 ^= 0xdd;
for (i = 0; i < ctx->siphash.finalisation; ++i) {
_sipRound;
}
b = v0 ^ v1 ^ v2 ^ v3;
_u64To8LE(out + 8, b);
}
wp_intern inline void validateSipHasherCtx(const WpHasherCtx *ctx) {
b8 magic_match = ctx->type == WP_HASHER_CTX_SIPHASH;
b8 rounds = checkRounds(ctx);
wpRuntimeAssert(magic_match && rounds, "Invalid Siphash context");
}
wp_intern inline b8 checkRounds(const WpHasherCtx *ctx) {
b8 rounds24 = ctx->siphash.compression == 2 && ctx->siphash.finalisation == 4;
b8 rounds48 = ctx->siphash.compression == 4 && ctx->siphash.finalisation == 8;
return rounds24 || rounds48;
}
+29
View File
@@ -0,0 +1,29 @@
// vim:fileencoding=utf-8:foldmethod=marker
/**
* Implementations of the SipHash-2-4-128, SipHash4-8-128 algorithms based on
* https://github.com/veorq/SipHash/blob/master/siphash.c
*/
#ifndef SIPHASH_H
#define SIPHASH_H
#include "hasher.h"
#include "../../stream/stream.h"
#include "../../../common/platform/platform.h"
#ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE
#endif // !WP_PLATFORM_CPP
WpHasher wpSip24Hasher(void);
WpHasher wpSip48Hasher(void);
WpHasher wpSip24HasherWithKey(WpU128 key);
WpHasher wpSip48HasherWithKey(WpU128 key);
WpU128 wpSipGetHash128(WpU8Stream *bytes, WpHasherCtx ctx);
#ifdef WP_PLATFORM_CPP
END_C_LINKAGE
#endif // !WP_PLATFORM_CPP
#endif // !SIPHASH_H
+83
View File
@@ -0,0 +1,83 @@
// vim:fileencoding=utf-8:foldmethod=marker
#include "map.h"
#include "../table/table.h"
WpHashMap hashMapAlloc(const WpAllocator *allocator, WpU8StreamEncoder encoder, WpKeyEqualTest key_eq,
u64 capacity, u64 key_size, u64 value_size) {
return hashMapAllocWithCustomHasher(allocator, WP_HASH_TABLE_DEFAULT_HASHER, encoder, key_eq,
capacity, key_size, value_size);
}
WpHashMap hashMapAllocWithCustomHasher(const WpAllocator *allocator, WpHasher hasher,
WpU8StreamEncoder encoder, WpKeyEqualTest key_eq,
u64 capacity, u64 key_size, u64 value_size) {
WpHashMap map = {0};
hashTableAlloc(allocator, &map, hasher, encoder, key_eq, capacity, key_size, value_size, true);
return map;
}
WpHashLookupResult hashMapFind(WpHashMap *map, void *key, u64 key_size) {
u64 hash = hashTableCalcHash(map, key, key_size);
WpHashBucketRef ref = hashTableBucketRef(map, hash);
return hashTableLookup(map, key, ref, key_size);
}
void hashMapUpdate(WpHashMap *map, void *key, void *value, u64 key_size, u64 value_size) {
WpHashLookupResult result = hashMapFind(map, key, key_size);
if (result.found) {
hashTableUpdate(map, value, result.ref, value_size);
}
}
void hashMapInsertCapped(WpHashMap *map, void *key, void *value, u64 key_size, u64 value_size) {
WpHashLookupResult result = hashMapFind(map, key, key_size);
if (!result.found && map->load_factor < WP_HASH_MAX_LOAD_FACTOR) {
hashTableInsert(map, key, value, result.ref, key_size, value_size);
}
}
void hashMapInsertOrUpdateCapped(WpHashMap *map, void *key, void *value, u64 key_size, u64 value_size) {
WpHashLookupResult result = hashMapFind(map, key, key_size);
if (result.found) {
hashTableUpdate(map, value, result.ref, value_size);
} else if (map->load_factor < WP_HASH_MAX_LOAD_FACTOR) {
hashTableInsert(map, key, value, result.ref, key_size, value_size);
}
}
void hashMapInsertAlloc(const WpAllocator *allocator, WpHashMap *map, void *key, void *value,
u64 key_size, u64 value_size) {
WpHashLookupResult result = hashMapFind(map, key, key_size);
if (!result.found) {
if (map->load_factor >= WP_HASH_MAX_LOAD_FACTOR) {
hashTableGrow(allocator, map, key_size, value_size);
// Rerun key lookup after growing
result = hashMapFind(map, key, key_size);
}
hashTableInsert(map, key, value, result.ref, key_size, value_size);
}
}
void hashMapInsertOrUpdateAlloc(const WpAllocator *allocator, WpHashMap *map, void *key, void *value,
u64 key_size, u64 value_size) {
WpHashLookupResult result = hashMapFind(map, key, key_size);
if (result.found) {
hashTableUpdate(map, value, result.ref, value_size);
} else {
if (map->load_factor >= WP_HASH_MAX_LOAD_FACTOR) {
hashTableGrow(allocator, map, key_size, value_size);
// Rerun key lookup after growing
result = hashMapFind(map, key, key_size);
}
hashTableInsert(map, key, value, result.ref, key_size, value_size);
}
}
void hashMapRemove(WpHashMap *map, void *key, u64 key_size, u64 value_size) {
WpHashLookupResult result = hashMapFind(map, key, key_size);
if (result.found) {
hashTableRemove(map, result.ref, key_size, value_size);
}
}
+134
View File
@@ -0,0 +1,134 @@
// vim:fileencoding=utf-8:foldmethod=marker
#ifndef MAP_H
#define MAP_H
#include "../table/table.h"
#include "../../../common/misc/misc_utils.h"
#include "../../../common/platform/platform.h"
#ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE
#endif // !WP_PLATFORM_CPP
typedef WpHashTable WpHashMap;
#ifdef WP_PLATFORM_CPP
#define wpHashMap(KEY_TYPE, VALUE_TYPE, U8_STREAM_ENCODER, KEY_EQ_TEST, CAPACITY) \
(WpHashMap{ \
WP_HASH_TABLE_DEFAULT_HASHER, \
U8_STREAM_ENCODER, \
KEY_EQ_TEST, \
wpArrayWithCapacity(KEY_TYPE, wpMiscUtilsU64RoundUpPow2(CAPACITY), WP_ARRAY_INIT_NONE), \
wpArrayWithCapacity(VALUE_TYPE, wpMiscUtilsU64RoundUpPow2(CAPACITY), WP_ARRAY_INIT_NONE), \
wpArrayWithCapacity(WpHashBucket, wpMiscUtilsU64RoundUpPow2(CAPACITY), WP_ARRAY_INIT_FILLED), \
WP_HASH_TABLE_MAGIC, \
wpMiscUtilsU64RoundUpPow2(CAPACITY) - 1, \
0.0f, \
true, \
})
#define wpHashMapCustomHasher(KEY_TYPE, VALUE_TYPE, HASHER, U8_STREAM_ENCODER, KEY_EQ_TEST, \
CAPACITY) \
(WpHashMap{ \
HASHER, \
U8_STREAM_ENCODER, \
KEY_EQ_TEST, \
wpArrayWithCapacity(KEY_TYPE, wpMiscUtilsU64RoundUpPow2(CAPACITY), WP_ARRAY_INIT_NONE), \
wpArrayWithCapacity(VALUE_TYPE, wpMiscUtilsU64RoundUpPow2(CAPACITY), WP_ARRAY_INIT_NONE), \
wpArrayWithCapacity(WpHashBucket, wpMiscUtilsU64RoundUpPow2(CAPACITY), WP_ARRAY_INIT_FILLED), \
WP_HASH_TABLE_MAGIC, \
wpMiscUtilsU64RoundUpPow2(CAPACITY) - 1, \
0.0f, \
true, \
})
#else
#define wpHashMap(KEY_TYPE, VALUE_TYPE, U8_STREAM_ENCODER, KEY_EQ_TEST, CAPACITY) \
((WpHashMap){ \
.hasher = WP_HASH_TABLE_DEFAULT_HASHER, \
.encoder = U8_STREAM_ENCODER, \
.key_eq = KEY_EQ_TEST, \
.keys = wpArrayWithCapacity(KEY_TYPE, wpMiscUtilsU64RoundUpPow2(CAPACITY), \
WP_ARRAY_INIT_NONE), \
.values = wpArrayWithCapacity(VALUE_TYPE, wpMiscUtilsU64RoundUpPow2(CAPACITY), \
WP_ARRAY_INIT_NONE), \
.buckets = wpArrayWithCapacity(WpHashBucket, wpMiscUtilsU64RoundUpPow2(CAPACITY), \
WP_ARRAY_INIT_FILLED), \
.magic = WP_HASH_TABLE_MAGIC, \
.bucket_mask = wpMiscUtilsU64RoundUpPow2(CAPACITY) - 1, \
.has_values = true, \
})
#define wpHashMapCustomHasher(KEY_TYPE, VALUE_TYPE, HASHER, U8_STREAM_ENCODER, KEY_EQ_TEST, \
CAPACITY) \
((WpHashMap){ \
.hasher = HASHER, \
.encoder = U8_STREAM_ENCODER, \
.key_eq = KEY_EQ_TEST, \
.keys = wpArrayWithCapacity(KEY_TYPE, wpMiscUtilsU64RoundUpPow2(CAPACITY), \
WP_ARRAY_INIT_NONE), \
.values = wpArrayWithCapacity(VALUE_TYPE, wpMiscUtilsU64RoundUpPow2(CAPACITY), \
WP_ARRAY_INIT_NONE), \
.buckets = wpArrayWithCapacity(WpHashBucket, wpMiscUtilsU64RoundUpPow2(CAPACITY), \
WP_ARRAY_INIT_FILLED), \
.magic = WP_HASH_TABLE_MAGIC, \
.bucket_mask = wpMiscUtilsU64RoundUpPow2(CAPACITY) - 1, \
.has_values = true, \
})
#endif
#define wpHashMapAlloc(KEY_TYPE, VALUE_TYPE, ALLOCATOR_PTR, U8_STREAM_ENCODER, KEY_EQ_TEST, \
CAPACITY) \
hashMapAlloc(ALLOCATOR_PTR, U8_STREAM_ENCODER, KEY_EQ_TEST, CAPACITY, sizeof(KEY_TYPE), \
sizeof(VALUE_TYPE))
#define wpHashMapCustomHasherAlloc(KEY_TYPE, VALUE_TYPE, ALLOCATOR_PTR, HASHER, U8_STREAM_ENCODER, \
KEY_EQ_TEST, CAPACITY) \
hashMapAllocWithCustomHasher(ALLOCATOR_PTR, HASHER, U8_STREAM_ENCODER, KEY_EQ_TEST, CAPACITY, \
sizeof(KEY_TYPE), sizeof(VALUE_TYPE))
#define wpHashMapKeys(KEY_TYPE, MAP_PTR) ((KEY_TYPE *)hashTableKeys(MAP_PTR, sizeof(KEY_TYPE)))
#define wpHashMapValues(VALUE_TYPE, MAP_PTR) \
((VALUE_TYPE *)hashTableValues(MAP_PTR, sizeof(VALUE_TYPE)))
#define wpHashMapCapacity(MAP_PTR) hashTableCapacity(MAP_PTR)
#define wpHashMapCount(MAP_PTR) hashTableCount(MAP_PTR)
#define wpHashMapKeySize(MAP_PTR) hashTableKeySize(MAP_PTR)
#define wpHashMapValueSize(MAP_PTR) hashTableValueSize(MAP_PTR)
#define wpHashMapFind(KEY_TYPE, MAP_PTR, KEY_PTR) hashMapFind(MAP_PTR, KEY_PTR, sizeof(KEY_TYPE))
#define wpHashMapInsertCapped(KEY_TYPE, VALUE_TYPE, MAP_PTR, KEY_PTR, VALUE_PTR) \
hashMapInsertCapped(MAP_PTR, KEY_PTR, VALUE_PTR, sizeof(KEY_TYPE), sizeof(VALUE_TYPE))
#define wpHashMapInsertOrUpdateCapped(KEY_TYPE, VALUE_TYPE, MAP_PTR, KEY_PTR, VALUE_PTR) \
hashMapInsertOrUpdateCapped(MAP_PTR, KEY_PTR, VALUE_PTR, sizeof(KEY_TYPE), sizeof(VALUE_TYPE))
#define wpHashMapUpdate(KEY_TYPE, VALUE_TYPE, MAP_PTR, KEY_PTR, VALUE_PTR) \
hashMapUpdate(MAP_PTR, KEY_PTR, VALUE_PTR, sizeof(KEY_TYPE), sizeof(VALUE_TYPE))
#define wpHashMapInsertAlloc(KEY_TYPE, VALUE_TYPE, ALLOCATOR_PTR, MAP_PTR, KEY_PTR, VALUE_PTR) \
hashMapInsertAlloc(ALLOCATOR_PTR, MAP_PTR, KEY_PTR, VALUE_PTR, sizeof(KEY_TYPE), \
sizeof(VALUE_TYPE))
#define wpHashMapInsertOrUpdateAlloc(KEY_TYPE, VALUE_TYPE, ALLOCATOR_PTR, MAP_PTR, KEY_PTR, \
VALUE_PTR) \
hashMapInsertOrUpdateAlloc(ALLOCATOR_PTR, MAP_PTR, KEY_PTR, VALUE_PTR, sizeof(KEY_TYPE), \
sizeof(VALUE_TYPE))
#define wpHashMapRemove(KEY_TYPE, VALUE_TYPE, MAP_PTR, KEY_PTR) \
hashMapRemove(MAP_PTR, KEY_PTR, sizeof(KEY_TYPE), sizeof(VALUE_TYPE))
#define wpHashMapClear(KEY_TYPE, VALUE_TYPE, MAP_PTR) \
hashTableClear(MAP_PTR, sizeof(KEY_TYPE), sizeof(VALUE_TYPE))
#define wpHashMapDealloc(KEY_TYPE, VALUE_TYPE, ALLOCATOR_PTR, MAP_PTR) \
hashTableDealloc(ALLOCATOR_PTR, MAP_PTR, sizeof(KEY_TYPE), sizeof(VALUE_TYPE))
WpHashMap hashMapAlloc(const WpAllocator *allocator, WpU8StreamEncoder encoder,
WpKeyEqualTest key_eq, u64 capacity, u64 key_size, u64 value_size);
WpHashMap hashMapAllocWithCustomHasher(const WpAllocator *allocator, WpHasher hasher,
WpU8StreamEncoder encoder, WpKeyEqualTest key_eq,
u64 capacity, u64 key_size, u64 value_size);
WpHashLookupResult hashMapFind(WpHashMap *map, void *key, u64 key_size);
void hashMapUpdate(WpHashMap *map, void *key, void *value, u64 key_size, u64 value_size);
void hashMapInsertCapped(WpHashMap *map, void *key, void *value, u64 key_size, u64 value_size);
void hashMapInsertOrUpdateCapped(WpHashMap *map, void *key, void *value, u64 key_size,
u64 value_size);
void hashMapInsertAlloc(const WpAllocator *allocator, WpHashMap *map, void *key,
void *value, u64 key_size, u64 value_size);
void hashMapInsertOrUpdateAlloc(const WpAllocator *allocator, WpHashMap *map, void *key,
void *value, u64 key_size, u64 value_size);
void hashMapRemove(WpHashMap *map, void *key, u64 key_size, u64 value_size);
#ifdef WP_PLATFORM_CPP
END_C_LINKAGE
#endif // !WP_PLATFORM_CPP
#endif // !MAP_H
+51
View File
@@ -0,0 +1,51 @@
// vim:fileencoding=utf-8:foldmethod=marker
#include "set.h"
#include "../table/table.h"
WpHashSet hashSetAlloc(const WpAllocator *allocator, WpU8StreamEncoder encoder, WpKeyEqualTest key_eq,
u64 capacity, u64 key_size) {
return hashSetAllocWithCustomHasher(allocator, WP_HASH_TABLE_DEFAULT_HASHER, encoder, key_eq,
capacity, key_size);
}
WpHashSet hashSetAllocWithCustomHasher(const WpAllocator *allocator, WpHasher hasher,
WpU8StreamEncoder encoder, WpKeyEqualTest key_eq, u64 capacity,
u64 key_size) {
WpHashSet set = {0};
hashTableAlloc(allocator, &set, hasher, encoder, key_eq, capacity, key_size, 0, false);
return set;
}
WpHashLookupResult hashSetFind(WpHashSet *set, void *item, u64 item_size) {
u64 hash = hashTableCalcHash(set, item, item_size);
WpHashBucketRef ref = hashTableBucketRef(set, hash);
return hashTableLookup(set, item, ref, item_size);
}
void hashSetInsertCapped(WpHashSet *set, void *item, u64 item_size) {
WpHashLookupResult result = hashSetFind(set, item, item_size);
if (!result.found && set->load_factor < WP_HASH_MAX_LOAD_FACTOR) {
hashTableInsert(set, item, NULL, result.ref, item_size, 0);
}
}
void hashSetInsertAlloc(const WpAllocator *allocator, WpHashSet *set, void *item, u64 item_size) {
WpHashLookupResult result = hashSetFind(set, item, item_size);
if (!result.found) {
if (set->load_factor >= WP_HASH_MAX_LOAD_FACTOR) {
hashTableGrow(allocator, set, item_size, 0);
// Rerun item lookup after growing
result = hashSetFind(set, item, item_size);
}
hashTableInsert(set, item, NULL, result.ref, item_size, 0);
}
}
void hashSetRemove(WpHashSet *set, void *item, u64 item_size) {
WpHashLookupResult result = hashSetFind(set, item, item_size);
if (result.found) {
hashTableRemove(set, result.ref, item_size, 0);
}
}
+105
View File
@@ -0,0 +1,105 @@
// vim:fileencoding=utf-8:foldmethod=marker
#ifndef SET_H
#define SET_H
#include "../table/table.h"
#include "../../../common/misc/misc_utils.h"
#include "../../../common/platform/platform.h"
#ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE
#endif // !WP_PLATFORM_CPP
typedef WpHashTable WpHashSet;
#ifdef WP_PLATFORM_CPP
#define wpHashSet(TYPE, U8_STREAM_ENCODER, ITEM_EQ_TEST, CAPACITY) \
(WpHashSet{ \
WP_HASH_TABLE_DEFAULT_HASHER, \
U8_STREAM_ENCODER, \
ITEM_EQ_TEST, \
wpArrayWithCapacity(TYPE, wpMiscUtilsU64RoundUpPow2(CAPACITY), WP_ARRAY_INIT_NONE), \
NULL, \
wpArrayWithCapacity(WpHashBucket, wpMiscUtilsU64RoundUpPow2(CAPACITY), WP_ARRAY_INIT_FILLED), \
WP_HASH_TABLE_MAGIC, \
wpMiscUtilsU64RoundUpPow2(CAPACITY) - 1, \
0.0f, \
false, \
})
#define wpHashSetCustomHasher(TYPE, HASHER, U8_STREAM_ENCODER, ITEM_EQ_TEST, CAPACITY) \
(WpHashSet{ \
HASHER, \
U8_STREAM_ENCODER, \
ITEM_EQ_TEST, \
wpArrayWithCapacity(TYPE, wpMiscUtilsU64RoundUpPow2(CAPACITY), WP_ARRAY_INIT_NONE), \
NULL, \
wpArrayWithCapacity(WpHashBucket, wpMiscUtilsU64RoundUpPow2(CAPACITY), WP_ARRAY_INIT_FILLED), \
WP_HASH_TABLE_MAGIC, \
wpMiscUtilsU64RoundUpPow2(CAPACITY) - 1, \
0.0f, \
false, \
})
#else
#define wpHashSet(TYPE, U8_STREAM_ENCODER, ITEM_EQ_TEST, CAPACITY) \
((WpHashSet){ \
.hasher = WP_HASH_TABLE_DEFAULT_HASHER, \
.encoder = U8_STREAM_ENCODER, \
.key_eq = ITEM_EQ_TEST, \
.keys = wpArrayWithCapacity(TYPE, wpMiscUtilsU64RoundUpPow2(CAPACITY), \
WP_ARRAY_INIT_NONE), \
.buckets = wpArrayWithCapacity(WpHashBucket, wpMiscUtilsU64RoundUpPow2(CAPACITY), \
WP_ARRAY_INIT_FILLED), \
.magic = WP_HASH_TABLE_MAGIC, \
.bucket_mask = wpMiscUtilsU64RoundUpPow2(CAPACITY) - 1, \
})
#define wpHashSetCustomHasher(TYPE, HASHER, U8_STREAM_ENCODER, ITEM_EQ_TEST, CAPACITY) \
((WpHashSet){ \
.hasher = HASHER, \
.encoder = U8_STREAM_ENCODER, \
.key_eq = ITEM_EQ_TEST, \
.keys = wpArrayWithCapacity(TYPE, wpMiscUtilsU64RoundUpPow2(CAPACITY), \
WP_ARRAY_INIT_NONE), \
.buckets = wpArrayWithCapacity(WpHashBucket, wpMiscUtilsU64RoundUpPow2(CAPACITY), \
WP_ARRAY_INIT_FILLED), \
.magic = WP_HASH_TABLE_MAGIC, \
.bucket_mask = wpMiscUtilsU64RoundUpPow2(CAPACITY) - 1, \
})
#endif
#define wpHashSetAlloc(TYPE, ALLOCATOR_PTR, U8_STREAM_ENCODER, ITEM_EQ_TEST, CAPACITY) \
hashSetAlloc(ALLOCATOR_PTR, U8_STREAM_ENCODER, ITEM_EQ_TEST, CAPACITY, sizeof(TYPE))
#define wpHashSetCustomHasherAlloc(TYPE, ALLOCATOR_PTR, HASHER, U8_STREAM_ENCODER, ITEM_EQ_TEST, \
CAPACITY) \
hashSetAllocWithCustomHasher(ALLOCATOR_PTR, HASHER, U8_STREAM_ENCODER, ITEM_EQ_TEST, CAPACITY, \
sizeof(TYPE))
#define wpHashSetItems(TYPE, SET_PTR) ((TYPE *)hashTableKeys(SET_PTR, sizeof(TYPE)))
#define wpHashSetCapacity(SET_PTR) hashTableCapacity(SET_PTR)
#define wpHashSetCount(SET_PTR) hashTableCount(SET_PTR)
#define wpHashSetItemSize(SET_PTR) hashTableKeySize(SET_PTR)
#define wpHashSetFind(TYPE, SET_PTR, ITEM_PTR) hashSetFind(SET_PTR, ITEM_PTR, sizeof(TYPE))
#define wpHashSetInsertCapped(TYPE, SET_PTR, ITEM_PTR) \
hashSetInsertCapped(SET_PTR, ITEM_PTR, sizeof(TYPE))
#define wpHashSetInsertAlloc(TYPE, ALLOCATOR_PTR, SET_PTR, ITEM_PTR) \
hashSetInsertAlloc(ALLOCATOR_PTR, SET_PTR, ITEM_PTR, sizeof(TYPE))
#define wpHashSetRemove(TYPE, SET_PTR, ITEM_PTR) hashSetRemove(SET_PTR, ITEM_PTR, sizeof(TYPE))
#define wpHashSetClear(TYPE, SET_PTR) hashTableClear(SET_PTR, sizeof(TYPE), 0)
#define wpHashSetDealloc(TYPE, ALLOCATOR_PTR, SET_PTR) \
hashTableDealloc(ALLOCATOR_PTR, SET_PTR, sizeof(TYPE), 0)
WpHashSet hashSetAlloc(const WpAllocator *allocator, WpU8StreamEncoder encoder,
WpKeyEqualTest key_eq, u64 capacity, u64 key_size);
WpHashSet hashSetAllocWithCustomHasher(const WpAllocator *allocator, WpHasher hasher,
WpU8StreamEncoder encoder, WpKeyEqualTest key_eq,
u64 capacity, u64 key_size);
WpHashLookupResult hashSetFind(WpHashSet *set, void *item, u64 item_size);
void hashSetInsertCapped(WpHashSet *set, void *item, u64 item_size);
void hashSetInsertAlloc(const WpAllocator *allocator, WpHashSet *set, void *item,
u64 item_size);
void hashSetRemove(WpHashSet *set, void *item, u64 item_size);
#ifdef WP_PLATFORM_CPP
END_C_LINKAGE
#endif // !WP_PLATFORM_CPP
#endif // !SET_H
+292
View File
@@ -0,0 +1,292 @@
// vim:fileencoding=utf-8:foldmethod=marker
#include "table.h"
#include "../hasher/hasher.h"
#include "../../mem/allocator/mem_allocator.h"
#include "../../stream/stream.h"
#include "../../../common/aliases/aliases.h"
#include "../../../common/assert/assert.h"
#include "../../../common/misc/misc_utils.h"
wp_persist inline void *hashTableGetKeyFromBucket(WpHashTable *table, WpHashBucket bucket, u64 key_size);
wp_persist inline void *hashTableGetValueFromBucket(WpHashTable *table, WpHashBucket bucket, u64 value_size);
wp_persist inline u64 hashTableGetDist(u64 dist_and_tag);
wp_persist inline u64 hashTableNextBucket(WpHashTable *table, u64 bucket_index);
wp_persist inline u64 hashTableDistInc(u64 dist_and_tag);
wp_persist inline u64 hashTableDistDec(u64 dist_and_tag);
wp_persist inline void hashTableValidate(const WpHashTable *table, u64 key_size, u64 value_size);
void hashTableAlloc(const WpAllocator *allocator, WpHashTable *table, WpHasher hasher,
WpU8StreamEncoder encoder, WpKeyEqualTest key_eq, u64 capacity, u64 key_size,
u64 value_size, b8 has_values) {
wpDebugAssert(allocator != NULL && table != NULL && encoder != NULL && key_eq != NULL,
"`allocator`, `table`, `encoder` and `key_eq` should not be NULL");
u64 table_capacity = wpMiscUtilsU64RoundUpPow2(capacity);
table->hasher = hasher;
table->encoder = encoder;
table->key_eq = key_eq;
table->keys = arrayAllocCapacity(allocator, table_capacity, WP_ARRAY_INIT_NONE, key_size);;
table->buckets = wpArrayAllocCapacity(WpHashBucket, allocator, table_capacity, WP_ARRAY_INIT_FILLED);
table->magic = WP_HASH_TABLE_MAGIC;
table->bucket_mask = table_capacity - 1;
table->load_factor = WP_HASH_MAX_LOAD_FACTOR;
table->has_values = has_values;
wpRuntimeAssert(table->keys != NULL && table->buckets != NULL, "Failed to allocate keys, buckets or both");
if (has_values) {
table->values = arrayAllocCapacity(allocator, table_capacity, WP_ARRAY_INIT_NONE, value_size);;
wpRuntimeAssert(table->values != NULL, "Failed to allocate values");
}
}
u64 hashTableCalcHash(WpHashTable *table, void *key, u64 key_size) {
hashTableValidate(table, key_size, 0);
wpDebugAssert(key != NULL, "`key` should not be NULL");
WpU8Stream stream = table->encoder(key);
return wpHasherGetHash64(&table->hasher, &stream);
}
WpHashBucketRef hashTableBucketRef(WpHashTable *table, u64 hash) {
hashTableValidate(table, 0, 0);
return (WpHashBucketRef){
.dist_and_tag = WP_HASH_DIST_INC | (hash & WP_HASH_TAG_MASK),
.bucket_index = hash & table->bucket_mask,
};
}
void *hashTableKeys(WpHashTable *table, u64 key_size) {
hashTableValidate(table, key_size, 0);
return table->keys;
}
void *hashTableValues(WpHashTable *table, u64 value_size) {
hashTableValidate(table, 0, value_size);
return table->values;
}
void *hashTableGetKeyFromBucketRef(WpHashTable *table, WpHashBucketRef ref, u64 key_size) {
return hashTableGetKeyFromBucket(table, table->buckets[ref.bucket_index], key_size);
}
void *hashTableGetValueFromBucketRef(WpHashTable *table, WpHashBucketRef ref, u64 value_size) {
return hashTableGetValueFromBucket(table, table->buckets[ref.bucket_index], value_size);
}
u64 hashTableCapacity(WpHashTable *table) {
hashTableValidate(table, 0, 0);
return wpArrayCapacity(table->keys);
}
u64 hashTableCount(WpHashTable *table) {
hashTableValidate(table, 0, 0);
return wpArrayCount(table->keys);
}
u64 hashTableKeySize(WpHashTable *table) {
hashTableValidate(table, 0, 0);
return wpArrayItemSize(table->keys);
}
u64 hashTableValueSize(WpHashTable *table) {
hashTableValidate(table, 0, 0);
return table->has_values ? wpArrayItemSize(table->values) : 0;
}
void hashTableGrow(const WpAllocator *allocator, WpHashTable *table, u64 key_size, u64 value_size) {
hashTableValidate(table, key_size, value_size);
wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
u64 capacity = wpMiscUtilsU64RoundUpPow2(hashTableCapacity(table) * 2);
u64 mask = capacity - wpU64Const(1);
WpArray keys = arrayAllocCapacity(allocator, capacity, WP_ARRAY_INIT_NONE, key_size);
WpArray values = NULL;
WpHashBucketArray buckets = wpArrayAllocCapacity(WpHashBucket, allocator, capacity, WP_ARRAY_INIT_FILLED);
wpRuntimeAssert(keys != NULL && buckets != NULL, "Failed to allocate keys, buckets or both");
if (table->has_values) {
values = arrayAllocCapacity(allocator, capacity, WP_ARRAY_INIT_NONE, value_size);
wpRuntimeAssert(values != NULL, "Failed to allocate values");
}
WpArray old_keys = table->keys;
WpArray old_values = table->values;
table->keys = keys;
table->values = values;
table->buckets = buckets;
table->bucket_mask = mask;
for (u64 i = 0; i < wpArrayCount(old_keys); ++i) {
void *key = arrayGet(old_keys, i, key_size);
void *value = table->has_values ? arrayGet(old_values, i, value_size) : NULL;
u64 hash = hashTableCalcHash(table, key, key_size);
WpHashBucketRef ref = hashTableBucketRef(table, hash);
hashTableInsert(table, key, value, ref, key_size, value_size);
}
}
WpHashLookupResult hashTableLookup(WpHashTable *table, void *key, WpHashBucketRef ref, u64 key_size) {
hashTableValidate(table, key_size, 0);
wpDebugAssert(key != NULL, "`key` should not be NULL");
while (true) {
WpHashBucket *bucket = &table->buckets[ref.bucket_index];
if (ref.dist_and_tag == bucket->dist_and_tag) {
b8 key_equal = table->key_eq(key, arrayGet(table->keys, bucket->item_index, key_size));
return (WpHashLookupResult){
.ref.dist_and_tag = ref.dist_and_tag,
.ref.bucket_index = ref.bucket_index,
.found = key_equal,
};
} else if (hashTableGetDist(ref.dist_and_tag) > hashTableGetDist(bucket->dist_and_tag)) {
return (WpHashLookupResult){
.ref.dist_and_tag = ref.dist_and_tag,
.ref.bucket_index = ref.bucket_index,
.found = false,
};
}
ref.dist_and_tag = hashTableDistInc(ref.dist_and_tag);
ref.bucket_index = hashTableNextBucket(table, ref.bucket_index);
}
}
void hashTableUpdate(WpHashTable *table, void *value, WpHashBucketRef ref, u64 value_size) {
hashTableValidate(table, 0, value_size);
if (!(table->has_values)) {
wpRuntimeAssert(0, "Attempting to update a hash table that has no values");
}
wpDebugAssert(value != NULL, "`value` should not be NULL");
WpHashBucket *bucket = &table->buckets[ref.bucket_index];
arraySet(table->values, bucket->item_index, value, value_size);
}
void hashTableInsert(WpHashTable *table, void *key, void *value, WpHashBucketRef ref, u64 key_size,
u64 value_size) {
hashTableValidate(table, key_size, value_size);
wpDebugAssert(key != NULL, "`key` should not be NULL");
u64 index = wpArrayCount(table->keys);
while (true) {
WpHashBucket *bucket = &table->buckets[ref.bucket_index];
if (bucket->dist_and_tag == 0) {
bucket->dist_and_tag = ref.dist_and_tag;
bucket->item_index = index;
break;
} else if (hashTableGetDist(ref.dist_and_tag) > hashTableGetDist(bucket->dist_and_tag)) {
wpMiscUtilsSwap(u64, &ref.dist_and_tag, &bucket->dist_and_tag);
wpMiscUtilsSwap(u64, &index, &bucket->item_index);
}
ref.dist_and_tag = hashTableDistInc(ref.dist_and_tag);
ref.bucket_index = hashTableNextBucket(table, ref.bucket_index);
}
arrayAppendCapped(table->keys, key, key_size);
if (table->has_values) {
arrayAppendCapped(table->values, value, value_size);
}
table->load_factor = (f32)wpArrayCount(table->keys) / (f32)wpArrayCapacity(table->keys);
}
void hashTableRemove(WpHashTable *table, WpHashBucketRef ref, u64 key_size, u64 value_size) {
hashTableValidate(table, key_size, value_size);
WpHashBucket *bucket = &table->buckets[ref.bucket_index];
u64 last_item_index = wpArrayCount(table->keys) - 1;
if (bucket->item_index < last_item_index) {
// Update the bucket for the last item before swapping
u64 hash = hashTableCalcHash(table, arrayGet(table->keys, last_item_index, key_size), key_size);
WpHashLookupResult result = hashTableLookup(table, arrayGet(table->keys, last_item_index, key_size),
hashTableBucketRef(table, hash), key_size);
wpRuntimeAssert(result.found, "Hash table item should exist but it doesn't");
table->buckets[result.ref.bucket_index].item_index = bucket->item_index;
arrayRemoveSwapEnd(table->keys, bucket->item_index, key_size);
if (table->has_values) {
arrayRemoveSwapEnd(table->values, bucket->item_index, value_size);
}
}
while (bucket->dist_and_tag > 0) {
u64 next_index = hashTableNextBucket(table, ref.bucket_index);
WpHashBucket *next = &table->buckets[next_index];
if (hashTableGetDist(next->dist_and_tag) > WP_HASH_DIST_INC) {
bucket->dist_and_tag = hashTableDistDec(next->dist_and_tag);
bucket->item_index = next->item_index;
ref.bucket_index = next_index;
bucket = &table->buckets[ref.bucket_index];
} else {
bucket->dist_and_tag = 0;
bucket->item_index = 0;
}
}
}
void hashTableClear(WpHashTable *table, u64 key_size, u64 value_size) {
hashTableValidate(table, key_size, value_size);
arrayClear(table->keys, key_size);
if (table->has_values) {
arrayClear(table->values, value_size);
}
wpArrayZero(WpHashBucket, table->buckets);
}
void hashTableDealloc(const WpAllocator *allocator, WpHashTable *table, u64 key_size, u64 value_size) {
wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
hashTableValidate(table, key_size, value_size);
arrayDealloc(allocator, table->keys, key_size);
wpArrayDealloc(WpHashBucket, allocator, table->buckets);
if (table->has_values) {
arrayDealloc(allocator, table->values, value_size);
}
}
wp_persist inline void *hashTableGetKeyFromBucket(WpHashTable *table, WpHashBucket bucket, u64 key_size) {
hashTableValidate(table, key_size, 0);
return arrayGet(table->keys, bucket.item_index, key_size);
}
wp_persist inline void *hashTableGetValueFromBucket(WpHashTable *table, WpHashBucket bucket, u64 value_size) {
hashTableValidate(table, 0, value_size);
return table->has_values ? arrayGet(table->values, bucket.item_index, value_size) : NULL;
}
wp_persist inline u64 hashTableGetDist(u64 dist_and_tag) {
return dist_and_tag & (~WP_HASH_TAG_MASK);
}
wp_persist inline u64 hashTableNextBucket(WpHashTable *table, u64 bucket_index) {
return (++bucket_index) & table->bucket_mask;
}
wp_persist inline u64 hashTableDistInc(u64 dist_and_tag) {
return dist_and_tag + WP_HASH_DIST_INC;
}
wp_persist inline u64 hashTableDistDec(u64 dist_and_tag) {
return dist_and_tag - WP_HASH_DIST_INC;
}
wp_persist inline void hashTableValidate(const WpHashTable *table, u64 key_size, u64 value_size) {
wpDebugAssert(table != NULL, "`table` should not be NULL");
wpRuntimeAssert(WP_HASH_TABLE_MAGIC == table->magic, "`table` is not a valid wapp hash table");
if (key_size > 0) {
wpRuntimeAssert(key_size == wpArrayItemSize(table->keys), "Invalid key type provided");
}
if (value_size > 0) {
wpRuntimeAssert(value_size == wpArrayItemSize(table->values), "Invalid value type provided");
}
}
+101
View File
@@ -0,0 +1,101 @@
// vim:fileencoding=utf-8:foldmethod=marker
/**
* A hash table implementation with Robin Hood open addressing for collision resolution.
*
* The implementation is based on a version of this C++ implementation:
* https://github.com/martinus/unordered_dense
*
* Extra references:
* - https://faultlore.com/blah/robinhood-part-1/
* - https://blog.hieunt.me/blog/robinhood-hashing
*
* IMPORTANT:
* This is the internal hash table implementation and it is not intended to be used directly.
* Please check ../map/map.h and ../set/set.h for the public APIs.
*/
#ifndef TABLE_H
#define TABLE_H
#include "../hasher/hasher.h"
#include "../hasher/murmur3.h"
#include "../../array/array.h"
#include "../../mem/allocator/mem_allocator.h"
#include "../../stream/stream.h"
#include "../../../common/aliases/aliases.h"
#include "../../../common/platform/platform.h"
#ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE
#endif // !WP_PLATFORM_CPP
#define WP_HASH_TABLE_MAGIC wpU64Const(0x57504854424c)
#define WP_HASH_TAG_BITS wpU64Const(32)
#define WP_HASH_DIST_INC (wpU64Const(1) << WP_HASH_TAG_BITS)
#define WP_HASH_TAG_MASK (WP_HASH_DIST_INC - wpU64Const(1))
#define WP_HASH_MAX_LOAD_FACTOR 0.65f
#define WP_HASH_TABLE_DEFAULT_HASHER wpX64Mur3Hasher()
typedef WpU8Stream (*WpU8StreamEncoder)(void *data);
typedef b8 (*WpKeyEqualTest)(void *a, void *b);
typedef struct WpHashBucket {
u64 dist_and_tag;
u64 item_index;
} WpHashBucket;
typedef WpHashBucket *WpHashBucketArray;
typedef struct WpHashTable {
WpHasher hasher;
WpU8StreamEncoder encoder;
WpKeyEqualTest key_eq;
WpArray keys;
WpArray values;
WpHashBucketArray buckets;
u64 magic;
u64 bucket_mask;
f32 load_factor;
b8 has_values;
} WpHashTable;
typedef struct WpHashBucketRef {
u64 dist_and_tag;
u64 bucket_index;
} WpHashBucketRef;
typedef struct WpHashLookupResult {
WpHashBucketRef ref;
b8 found;
} WpHashLookupResult;
void hashTableAlloc(const WpAllocator *allocator, WpHashTable *table,
WpHasher hasher, WpU8StreamEncoder encoder,
WpKeyEqualTest key_eq, u64 capacity, u64 key_size,
u64 value_size, b8 has_values);
u64 hashTableCalcHash(WpHashTable *table, void *key, u64 key_size);
WpHashBucketRef hashTableBucketRef(WpHashTable *table, u64 hash);
void *hashTableKeys(WpHashTable *table, u64 key_size);
void *hashTableValues(WpHashTable *table, u64 value_size);
void *hashTableGetKeyFromBucketRef(WpHashTable *table, WpHashBucketRef ref, u64 key_size);
void *hashTableGetValueFromBucketRef(WpHashTable *table, WpHashBucketRef ref, u64 value_size);
u64 hashTableCapacity(WpHashTable *table);
u64 hashTableCount(WpHashTable *table);
u64 hashTableKeySize(WpHashTable *table);
u64 hashTableValueSize(WpHashTable *table);
void hashTableGrow(const WpAllocator *allocator, WpHashTable *table, u64 key_size,
u64 value_size);
WpHashLookupResult hashTableLookup(WpHashTable *table, void *key, WpHashBucketRef ref, u64 key_size);
void hashTableUpdate(WpHashTable *table, void *value, WpHashBucketRef ref, u64 value_size);
void hashTableInsert(WpHashTable *table, void *key, void *value, WpHashBucketRef ref,
u64 key_size, u64 value_size);
void hashTableRemove(WpHashTable *table, WpHashBucketRef ref, u64 key_size, u64 value_size);
void hashTableClear(WpHashTable *table, u64 key_size, u64 value_size);
void hashTableDealloc(const WpAllocator *allocator, WpHashTable *table, u64 key_size,
u64 value_size);
#ifdef WP_PLATFORM_CPP
END_C_LINKAGE
#endif // !WP_PLATFORM_CPP
#endif // !TABLE_H
+53 -10
View File
@@ -5,31 +5,74 @@
#include "../../../common/assert/assert.h" #include "../../../common/assert/assert.h"
#include <stdlib.h> #include <stdlib.h>
void *wapp_mem_allocator_alloc(const Allocator *allocator, u64 size) { void *wpMemAllocatorAlloc(const WpAllocator *allocator, u64 size) {
wapp_debug_assert(allocator != NULL && (allocator->alloc) != NULL, "`allocator` and `allocator->alloc` should not be NULL"); wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
if (!wpMemAllocatorOpSupported(allocator, WP_MEM_OP_ALLOC)) {
return NULL;
}
return allocator->alloc(size, allocator->obj); return allocator->alloc(size, allocator->obj);
} }
void *wapp_mem_allocator_alloc_aligned(const Allocator *allocator, u64 size, u64 alignment) { void *wpMemAllocatorAllocAligned(const WpAllocator *allocator, u64 size, u64 alignment) {
wapp_debug_assert(allocator != NULL && (allocator->alloc_aligned) != NULL, "`allocator` and `allocator->alloc_aligned` should not be NULL"); wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
if (!wpMemAllocatorOpSupported(allocator, WP_MEM_OP_ALLOC_ALIGNED)) {
return NULL;
}
return allocator->alloc_aligned(size, alignment, allocator->obj); return allocator->alloc_aligned(size, alignment, allocator->obj);
} }
void *wapp_mem_allocator_realloc(const Allocator *allocator, void *ptr, u64 old_size, u64 new_size) { void *wpMemAllocatorRealloc(const WpAllocator *allocator, void *ptr, u64 old_size, u64 new_size) {
wapp_debug_assert(allocator != NULL && (allocator->realloc) != NULL, "`allocator` and `allocator->realloc` should not be NULL"); wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
if (!wpMemAllocatorOpSupported(allocator, WP_MEM_OP_REALLOC)) {
return NULL;
}
return allocator->realloc(ptr, old_size, new_size, allocator->obj); return allocator->realloc(ptr, old_size, new_size, allocator->obj);
} }
void *wapp_mem_allocator_realloc_aligned(const Allocator *allocator, void *ptr, u64 old_size, void *wpMemAllocatorReallocAligned(const WpAllocator *allocator, void *ptr, u64 old_size,
u64 new_size, u64 alignment) { u64 new_size, u64 alignment) {
wapp_debug_assert(allocator != NULL && (allocator->realloc_aligned) != NULL, "`allocator` and `allocator->realloc_aligned` should not be NULL"); wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
if (!wpMemAllocatorOpSupported(allocator, WP_MEM_OP_REALLOC_ALIGNED)) {
return NULL;
}
return allocator->realloc_aligned(ptr, old_size, new_size, alignment, allocator->obj); return allocator->realloc_aligned(ptr, old_size, new_size, alignment, allocator->obj);
} }
void wapp_mem_allocator_free(const Allocator *allocator, void **ptr, u64 size) { void wpMemAllocatorFree(const WpAllocator *allocator, void **ptr, u64 size) {
if (!allocator || !(allocator->free)) { wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
if (!wpMemAllocatorOpSupported(allocator, WP_MEM_OP_FREE)) {
return; return;
} }
allocator->free(ptr, size, allocator->obj); allocator->free(ptr, size, allocator->obj);
} }
b8 wpMemAllocatorOpSupported(const WpAllocator *allocator, WpMemOp op) {
wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
switch (op) {
case WP_MEM_OP_ALLOC:
return allocator->alloc != NULL;
case WP_MEM_OP_ALLOC_ALIGNED:
return allocator->alloc_aligned != NULL;
case WP_MEM_OP_REALLOC:
return allocator->realloc != NULL;
case WP_MEM_OP_REALLOC_ALIGNED:
return allocator->realloc_aligned != NULL;
case WP_MEM_OP_FREE:
return allocator->free != NULL;
default:
break;
}
return false;
}
+38 -27
View File
@@ -7,44 +7,55 @@
#include "../../../common/platform/platform.h" #include "../../../common/platform/platform.h"
#include <string.h> #include <string.h>
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
typedef void *(MemAllocFunc)(u64 size, void *alloc_obj); typedef enum WpMemOp {
typedef void *(MemAllocAlignedFunc)(u64 size, u64 alignment, void *alloc_obj); WP_MEM_OP_ALLOC,
typedef void *(MemReallocFunc)(void *ptr, u64 old_size, u64 new_size, void *alloc_obj); WP_MEM_OP_ALLOC_ALIGNED,
typedef void *(MemReallocAlignedFunc)(void *ptr, u64 old_size, u64 new_size, u64 alignment, void *alloc_obj); WP_MEM_OP_REALLOC,
typedef void (MemFreeFunc)(void **ptr, u64 size, void *alloc_obj); WP_MEM_OP_REALLOC_ALIGNED,
WP_MEM_OP_FREE,
typedef struct Allocator Allocator; COUNT_MEM_OPS
struct Allocator { } WpMemOp;
typedef void *(WpMemAllocFunc)(u64 size, void *alloc_obj);
typedef void *(WpMemAllocAlignedFunc)(u64 size, u64 alignment, void *alloc_obj);
typedef void *(WpMemReallocFunc)(void *ptr, u64 old_size, u64 new_size, void *alloc_obj);
typedef void *(WpMemReallocAlignedFunc)(void *ptr, u64 old_size, u64 new_size, u64 alignment, void *alloc_obj);
typedef void (WpMemFreeFunc)(void **ptr, u64 size, void *alloc_obj);
typedef struct WpAllocator WpAllocator;
struct WpAllocator {
void *obj; void *obj;
MemAllocFunc *alloc; WpMemAllocFunc *alloc;
MemAllocAlignedFunc *alloc_aligned; WpMemAllocAlignedFunc *alloc_aligned;
MemReallocFunc *realloc; WpMemReallocFunc *realloc;
MemReallocAlignedFunc *realloc_aligned; WpMemReallocAlignedFunc *realloc_aligned;
MemFreeFunc *free; WpMemFreeFunc *free;
}; };
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
#define wapp_mem_allocator_invalid(ALLOCATOR) ([&]() { \ #define wpMemAllocatorInvalid(ALLOCATOR) ([&]() { \
Allocator alloc{}; \ WpAllocator alloc{}; \
return memcmp(ALLOCATOR, &alloc, sizeof(Allocator)) == 0; \ return memcmp(ALLOCATOR, &alloc, sizeof(WpAllocator)) == 0; \
}()) }())
#else #else
#define wapp_mem_allocator_invalid(ALLOCATOR) (memcmp(ALLOCATOR, &((Allocator){0}), sizeof(Allocator)) == 0) #define wpMemAllocatorInvalid(ALLOCATOR) (memcmp(ALLOCATOR, &((WpAllocator){0}), sizeof(WpAllocator)) == 0)
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
void *wapp_mem_allocator_alloc(const Allocator *allocator, u64 size); void *wpMemAllocatorAlloc(const WpAllocator *allocator, u64 size);
void *wapp_mem_allocator_alloc_aligned(const Allocator *allocator, u64 size, u64 alignment); void *wpMemAllocatorAllocAligned(const WpAllocator *allocator, u64 size, u64 alignment);
void *wapp_mem_allocator_realloc(const Allocator *allocator, void *ptr, u64 old_size, u64 new_size); void *wpMemAllocatorRealloc(const WpAllocator *allocator, void *ptr, u64 old_size, u64 new_size);
void *wapp_mem_allocator_realloc_aligned(const Allocator *allocator, void *ptr, u64 old_size, void *wpMemAllocatorReallocAligned(const WpAllocator *allocator, void *ptr, u64 old_size,
u64 new_size, u64 alignment); u64 new_size, u64 alignment);
void wapp_mem_allocator_free(const Allocator *allocator, void **ptr, u64 size); void wpMemAllocatorFree(const WpAllocator *allocator, void **ptr, u64 size);
b8 wpMemAllocatorOpSupported(const WpAllocator *allocator, WpMemOp op);
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !MEM_ALLOCATOR_H #endif // !MEM_ALLOCATOR_H
+3 -3
View File
@@ -6,9 +6,9 @@
#include "../../../common/misc/misc_utils.h" #include "../../../common/misc/misc_utils.h"
#include <stddef.h> #include <stddef.h>
void *wapp_mem_util_align_forward(void *ptr, u64 alignment) { void *wpMemUtilAlignForward(void *ptr, u64 alignment) {
wapp_debug_assert(ptr != NULL, "`ptr` should not be NULL"); wpDebugAssert(ptr != NULL, "`ptr` should not be NULL");
wapp_runtime_assert(wapp_is_power_of_two(alignment), "`alignment` value is not a power of two"); wpRuntimeAssert(wpMiscUtilsIsPowerOfTwo(alignment), "`alignment` value is not a power of two");
uptr p = (uptr)ptr; uptr p = (uptr)ptr;
uptr align = (uptr)alignment; uptr align = (uptr)alignment;
+5 -5
View File
@@ -6,14 +6,14 @@
#include "../../../common/aliases/aliases.h" #include "../../../common/aliases/aliases.h"
#include "../../../common/platform/platform.h" #include "../../../common/platform/platform.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
void *wapp_mem_util_align_forward(void *ptr, u64 alignment); void *wpMemUtilAlignForward(void *ptr, u64 alignment);
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !MEM_UTILS_H #endif // !MEM_UTILS_H
+22 -22
View File
@@ -6,15 +6,15 @@
#include "../../common/misc/misc_utils.h" #include "../../common/misc/misc_utils.h"
#include <string.h> #include <string.h>
void _queue_push(GenericQueue *queue, void *item, u64 item_size) { void queuePush(WpQueue *queue, void *item, u64 item_size) {
wapp_debug_assert(queue != NULL, "`queue` should not be NULL"); wpDebugAssert(queue != NULL, "`queue` should not be NULL");
wapp_runtime_assert(item_size == wapp_array_item_size(queue->items), "Invalid type"); wpRuntimeAssert(item_size == wpArrayItemSize(queue->items), "Invalid type");
u64 capacity = wapp_array_capacity(queue->items); u64 capacity = wpArrayCapacity(queue->items);
if (queue->count >= capacity) { return; } if (queue->count >= capacity) { return; }
u64 index = (queue->back)++; u64 index = (queue->back)++;
_array_set(queue->items, index, item, item_size); arraySet(queue->items, index, item, item_size);
++(queue->count); ++(queue->count);
if (queue->back >= capacity) { if (queue->back >= capacity) {
@@ -22,30 +22,30 @@ void _queue_push(GenericQueue *queue, void *item, u64 item_size) {
} }
} }
GenericQueue *_queue_push_alloc(const Allocator *allocator, GenericQueue *queue, void *item, u64 item_size) { WpQueue *queuePushAlloc(const WpAllocator *allocator, WpQueue *queue, void *item, u64 item_size) {
wapp_debug_assert(allocator != NULL && queue != NULL && item != NULL, wpDebugAssert(allocator != NULL && queue != NULL && item != NULL,
"`allocator`, `queue` and `item` should not be NULL"); "`allocator`, `queue` and `item` should not be NULL");
wapp_runtime_assert(item_size == wapp_array_item_size(queue->items), "Invalid type"); wpRuntimeAssert(item_size == wpArrayItemSize(queue->items), "Invalid type");
GenericQueue *output = queue; WpQueue *output = queue;
u64 capacity = wapp_array_capacity(queue->items); u64 capacity = wpArrayCapacity(queue->items);
// NOTE (Abdelrahman): Extracted into variable to fix MSVC error // NOTE (Abdelrahman): Extracted into variable to fix MSVC error
b8 queue_full = queue->count >= capacity; b8 queue_full = queue->count >= capacity;
if (queue_full) { if (queue_full) {
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(capacity * 2); u64 new_capacity = wpMiscUtilsU64RoundUpPow2(capacity * 2);
u64 array_size = _array_calc_alloc_size(new_capacity, item_size); u64 array_size = arrayCalcAllocSize(new_capacity, item_size);
u64 alloc_size = sizeof(GenericQueue) + array_size; u64 alloc_size = sizeof(WpQueue) + array_size;
void *buffer = wapp_mem_allocator_alloc(allocator, alloc_size); void *buffer = wpMemAllocatorAlloc(allocator, alloc_size);
if (!buffer) { if (!buffer) {
goto RETURN_QUEUE_PUSH_ALLOC; goto RETURN_QUEUE_PUSH_ALLOC;
} }
memset((void *)buffer, 0, alloc_size); memset((void *)buffer, 0, alloc_size);
output = (GenericQueue *)buffer; output = (WpQueue *)buffer;
output->items = _array_from_preallocated_buffer((void *)(output + 1), array_size, ARRAY_INIT_FILLED, item_size); output->items = arrayFromPreallocatedBuffer((void *)(output + 1), array_size, WP_ARRAY_INIT_FILLED, item_size);
// NOTE (Abdelrahman): When the queue is full, the front and back indices should // NOTE (Abdelrahman): When the queue is full, the front and back indices should
// always be the same // always be the same
@@ -84,25 +84,25 @@ GenericQueue *_queue_push_alloc(const Allocator *allocator, GenericQueue *queue,
output->count = queue->count; output->count = queue->count;
} }
_queue_push(output, item, item_size); queuePush(output, item, item_size);
RETURN_QUEUE_PUSH_ALLOC: RETURN_QUEUE_PUSH_ALLOC:
return output; return output;
} }
void *_queue_pop(GenericQueue *queue, u64 item_size) { void *queuePop(WpQueue *queue, u64 item_size) {
wapp_debug_assert(queue != NULL, "`queue` should not be NULL"); wpDebugAssert(queue != NULL, "`queue` should not be NULL");
wapp_runtime_assert(item_size == wapp_array_item_size(queue->items), "Invalid type"); wpRuntimeAssert(item_size == wpArrayItemSize(queue->items), "Invalid type");
if (queue->count == 0) { return NULL; } if (queue->count == 0) { return NULL; }
u64 index = (queue->front)++; u64 index = (queue->front)++;
--(queue->count); --(queue->count);
u64 capacity = wapp_array_capacity(queue->items); u64 capacity = wpArrayCapacity(queue->items);
if (queue->front >= capacity) { if (queue->front >= capacity) {
queue->front = 0; queue->front = 0;
} }
return _array_get(queue->items, index, item_size); return arrayGet(queue->items, index, item_size);
} }
+55 -50
View File
@@ -8,42 +8,42 @@
#include "../../common/aliases/aliases.h" #include "../../common/aliases/aliases.h"
#include "../../common/platform/platform.h" #include "../../common/platform/platform.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
typedef struct { typedef struct WpQueue {
GenericArray items; WpArray items;
u64 front; u64 front;
u64 back; u64 back;
u64 count; u64 count;
} GenericQueue; } WpQueue;
// NOTE (Abdelrahman): GenericQueue typedefs for readability // NOTE (Abdelrahman): WpQueue typedefs for readability
typedef GenericQueue VoidPtrQueue; typedef WpQueue WpVoidPtrQueue;
typedef GenericQueue C8Queue; typedef WpQueue WpC8Queue;
typedef GenericQueue C16Queue; typedef WpQueue WpC16Queue;
typedef GenericQueue C32Queue; typedef WpQueue WpC32Queue;
typedef GenericQueue U8Queue; typedef WpQueue WpU8Queue;
typedef GenericQueue U16Queue; typedef WpQueue WpU16Queue;
typedef GenericQueue U32Queue; typedef WpQueue WpU32Queue;
typedef GenericQueue U64Queue; typedef WpQueue WpU64Queue;
typedef GenericQueue B8Queue; typedef WpQueue WpB8Queue;
typedef GenericQueue I8Queue; typedef WpQueue WpI8Queue;
typedef GenericQueue I16Queue; typedef WpQueue WpI16Queue;
typedef GenericQueue I32Queue; typedef WpQueue WpI32Queue;
typedef GenericQueue I64Queue; typedef WpQueue WpI64Queue;
typedef GenericQueue F32Queue; typedef WpQueue WpF32Queue;
typedef GenericQueue F64Queue; typedef WpQueue WpF64Queue;
typedef GenericQueue F128Queue; typedef WpQueue WpF128Queue;
typedef GenericQueue UptrQueue; typedef WpQueue WpUptrQueue;
typedef GenericQueue IptrQueue; typedef WpQueue WpIptrQueue;
typedef GenericQueue Str8Queue; typedef WpQueue WpStr8Queue;
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
#define wapp_queue(TYPE, CAPACITY) ([&]() { \ #define wpQueue(TYPE, CAPACITY) ([&]() { \
wapp_persist GenericArray arr = wapp_array_with_capacity(TYPE, CAPACITY, ARRAY_INIT_FILLED); \ wp_persist WpArray arr = wpArrayWithCapacity(TYPE, CAPACITY, WP_ARRAY_INIT_FILLED); \
wapp_persist GenericQueue queue = { \ wp_persist WpQueue queue = { \
arr, \ arr, \
0, \ 0, \
0, \ 0, \
@@ -52,9 +52,9 @@ typedef GenericQueue Str8Queue;
\ \
return queue; \ return queue; \
}()) }())
#define wapp_queue_alloc(TYPE, ALLOCATOR_PTR, CAPACITY) ([&]() { \ #define wpQueueAlloc(TYPE, ALLOCATOR_PTR, CAPACITY) ([&]() { \
wapp_persist GenericQueue queue = { \ wp_persist WpQueue queue = { \
wapp_array_alloc_capacity(TYPE, ALLOCATOR_PTR, CAPACITY, ARRAY_INIT_FILLED), \ wpArrayAllocCapacity(TYPE, ALLOCATOR_PTR, CAPACITY, WP_ARRAY_INIT_FILLED), \
0, \ 0, \
0, \ 0, \
0, \ 0, \
@@ -63,38 +63,43 @@ typedef GenericQueue Str8Queue;
return queue; \ return queue; \
}()) }())
#else #else
#define wapp_queue(TYPE, CAPACITY) ((GenericQueue){ \ #define wpQueue(TYPE, CAPACITY) ((WpQueue){ \
.items = wapp_array_with_capacity(TYPE, CAPACITY, ARRAY_INIT_FILLED), \ .items = wpArrayWithCapacity(TYPE, CAPACITY, WP_ARRAY_INIT_FILLED), \
.front = 0, \ .front = 0, \
.back = 0, \ .back = 0, \
.count = 0, \ .count = 0, \
}) })
#define wapp_queue_alloc(TYPE, ALLOCATOR_PTR, CAPACITY) ((GenericQueue){ \ #define wpQueueAlloc(TYPE, ALLOCATOR_PTR, CAPACITY) ((WpQueue){ \
.items = wapp_array_alloc_capacity(TYPE, ALLOCATOR_PTR, CAPACITY, ARRAY_INIT_FILLED), \ .items = wpArrayAllocCapacity(TYPE, ALLOCATOR_PTR, CAPACITY, WP_ARRAY_INIT_FILLED), \
.front = 0, \ .front = 0, \
.back = 0, \ .back = 0, \
.count = 0, \ .count = 0, \
}) })
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#define wapp_queue_capacity(QUEUE_PTR) (wapp_array_capacity((QUEUE_PTR)->items)) #define wpQueueCapacity(QUEUE_PTR) (wpArrayCapacity((QUEUE_PTR)->items))
#define wapp_queue_item_size(QUEUE_PTR) (wapp_array_item_size((QUEUE_PTR)->items)) #define wpQueueItemSize(QUEUE_PTR) (wpArrayItemSize((QUEUE_PTR)->items))
#define wapp_queue_push(TYPE, QUEUE_PTR, VALUE_PTR) ( \ #define wpQueuePush(TYPE, QUEUE_PTR, VALUE_PTR) ( \
_queue_push(QUEUE_PTR, VALUE_PTR, sizeof(TYPE)) \ queuePush(QUEUE_PTR, VALUE_PTR, sizeof(TYPE)) \
) )
#define wapp_queue_push_alloc(TYPE, ALLOCATOR_PTR, QUEUE_PTR, VALUE_PTR) ( \ #define wpQueuePushAlloc(TYPE, ALLOCATOR_PTR, QUEUE_PTR, VALUE_PTR) ( \
_queue_push_alloc(ALLOCATOR_PTR, QUEUE_PTR, VALUE_PTR, sizeof(TYPE)) \ queuePushAlloc(ALLOCATOR_PTR, QUEUE_PTR, VALUE_PTR, sizeof(TYPE)) \
) )
#define wapp_queue_pop(TYPE, QUEUE_PTR) ( \ #define wpQueuePop(TYPE, QUEUE_PTR) ( \
(TYPE *)_queue_pop(QUEUE_PTR, sizeof(TYPE)) \ (TYPE *)queuePop(QUEUE_PTR, sizeof(TYPE)) \
) )
#define wpQueueDealloc(TYPE, ALLOCATOR_PTR, QUEUE_PTR) \
(wpArrayDealloc(TYPE, ALLOCATOR_PTR, &((QUEUE_PTR)->items)), \
(QUEUE_PTR)->front = 0, \
(QUEUE_PTR)->back = 0, \
(QUEUE_PTR)->count = 0)
void _queue_push(GenericQueue *queue, void *item, u64 item_size); void queuePush(WpQueue *queue, void *item, u64 item_size);
GenericQueue *_queue_push_alloc(const Allocator *allocator, GenericQueue *queue, void *item, u64 item_size); WpQueue *queuePushAlloc(const WpAllocator *allocator, WpQueue *queue, void *item, u64 item_size);
void *_queue_pop(GenericQueue *queue, u64 item_size); void *queuePop(WpQueue *queue, u64 item_size);
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !QUEUE_H #endif // !QUEUE_H
+43
View File
@@ -0,0 +1,43 @@
// vim:fileencoding=utf-8:foldmethod=marker
#include "stream.h"
#include "../../common/aliases/aliases.h"
#include "../../common/assert/assert.h"
void streamValidate(const WpStream *stream, u64 item_size);
b8 wpStreamAtEnd(const WpStream *stream) {
return stream->position >= stream->count;
}
b8 streamHasCount(const WpStream *stream, u64 count) {
return stream->position + count <= stream->count;
}
void *streamPeekWithOffset(const WpStream *stream, u64 offset, u64 item_size) {
streamValidate(stream, item_size);
if (streamHasCount(stream, offset + 1)) {
u64 index = (stream->position + offset) * stream->item_size;
return (void *)(&((u8 *)(stream->data))[index]);
}
return NULL;
}
void *streamConsumeCount(WpStream *stream, u64 count, u64 item_size) {
streamValidate(stream, item_size);
if (streamHasCount(stream, count)) {
u64 index = stream->position * stream->item_size;
stream->position += count;
return (void *)(&((u8 *)(stream->data))[index]);
}
return NULL;
}
void streamValidate(const WpStream *stream, u64 item_size) {
wpDebugAssert(stream != NULL, "`stream` should not be NULL");
wpRuntimeAssert(stream->item_size == item_size, "Invalid item type provided");
}
+80
View File
@@ -0,0 +1,80 @@
// vim:fileencoding=utf-8:foldmethod=marker
#ifndef STREAM_H
#define STREAM_H
#include "../../common/aliases/aliases.h"
#include "../../common/platform/platform.h"
#ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE
#endif // !WP_PLATFORM_CPP
typedef struct WpStream {
void *data;
u64 count;
u64 position;
u64 item_size;
} WpStream;
// NOTE (Abdelrahman): WpStream typedefs for readability
typedef WpStream WpVoidPtrStream;
typedef WpStream WpC8Stream;
typedef WpStream WpC16Stream;
typedef WpStream WpC32Stream;
typedef WpStream WpU8Stream;
typedef WpStream WpU16Stream;
typedef WpStream WpU32Stream;
typedef WpStream WpU64Stream;
typedef WpStream WpB8Stream;
typedef WpStream WpI8Stream;
typedef WpStream WpI16Stream;
typedef WpStream WpI32Stream;
typedef WpStream WpI64Stream;
typedef WpStream WpF32Stream;
typedef WpStream WpF64Stream;
typedef WpStream WpF128Stream;
typedef WpStream WpUptrStream;
typedef WpStream WpIptrStream;
typedef WpStream WpStr8Stream;
#ifdef WP_PLATFORM_CPP
#define wpStream(TYPE, DATA, SIZE) ([&]() { \
return WpStream{ \
DATA, \
SIZE / sizeof(TYPE), \
0, \
sizeof(TYPE) \
}; \
}())
#else
#define wpStream(TYPE, DATA, SIZE) ( \
(WpStream){ \
.data = DATA, \
.count = SIZE / sizeof(TYPE), \
.position = 0, \
.item_size = sizeof(TYPE) \
} \
)
#endif
#define wpStreamHasNext(STREAM) streamHasCount(STREAM, 1)
#define wpStreamHasCount(STREAM, COUNT) streamHasCount(STREAM, COUNT)
#define wpStreamPeek(TYPE, STREAM) ((TYPE *)streamPeekWithOffset(STREAM, 0, sizeof(TYPE)))
#define wpStreamPeekWithOffset(TYPE, STREAM, OFFSET) \
((TYPE *)streamPeekWithOffset(STREAM, OFFSET, sizeof(TYPE)))
#define wpStreamConsume(TYPE, STREAM) ((TYPE *)streamConsumeCount(STREAM, 1, sizeof(TYPE)))
#define wpStreamConsumeCount(TYPE, STREAM, COUNT) \
((TYPE *)streamConsumeCount(STREAM, COUNT, sizeof(TYPE)))
b8 wpStreamAtEnd(const WpStream *stream);
b8 streamHasCount(const WpStream *stream, u64 count);
void *streamPeekWithOffset(const WpStream *stream, u64 offset, u64 item_size);
void *streamConsumeCount(WpStream *stream, u64 count, u64 item_size);
#ifdef WP_PLATFORM_CPP
END_C_LINKAGE
#endif // !WP_PLATFORM_CPP
#endif // !STREAM_H
+103 -98
View File
@@ -11,17 +11,17 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#define STR8_BUF_ALLOC_SIZE(CAPACITY) (sizeof(Str8) + sizeof(c8) * CAPACITY) #define STR8_BUF_ALLOC_SIZE(CAPACITY) (sizeof(WpStr8) + sizeof(c8) * CAPACITY)
Str8 *wapp_str8_alloc_buf(const Allocator *allocator, u64 capacity) { WpStr8 *wpStr8AllocBuf(const WpAllocator *allocator, u64 capacity) {
wapp_debug_assert(allocator != NULL, "`allocator` should not be NULL"); wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
Str8 *str = wapp_mem_allocator_alloc(allocator, STR8_BUF_ALLOC_SIZE(capacity)); WpStr8 *str = wpMemAllocatorAlloc(allocator, STR8_BUF_ALLOC_SIZE(capacity));
if (!str) { if (!str) {
goto RETURN_STR8; goto RETURN_STR8;
} }
str->buf = (u8 *)str + sizeof(Str8); str->buf = (u8 *)str + sizeof(WpStr8);
str->size = 0; str->size = 0;
str->capacity = capacity; str->capacity = capacity;
@@ -29,8 +29,8 @@ RETURN_STR8:
return str; return str;
} }
Str8 *wapp_str8_alloc_and_fill_buf(const Allocator *allocator, u64 capacity) { WpStr8 *wpStr8AllocAndFillBuf(const WpAllocator *allocator, u64 capacity) {
Str8 *out = wapp_str8_alloc_buf(allocator, capacity); WpStr8 *out = wpStr8AllocBuf(allocator, capacity);
if (out) { if (out) {
memset(out->buf, 0, capacity); memset(out->buf, 0, capacity);
out->size = capacity; out->size = capacity;
@@ -38,11 +38,11 @@ Str8 *wapp_str8_alloc_and_fill_buf(const Allocator *allocator, u64 capacity) {
return out; return out;
} }
Str8 *wapp_str8_alloc_cstr(const Allocator *allocator, const char *str) { WpStr8 *wpStr8AllocCstr(const WpAllocator *allocator, const char *str) {
wapp_debug_assert(allocator != NULL && str != NULL, "`allocator` and `str` should not be NULL"); wpDebugAssert(allocator != NULL && str != NULL, "`allocator` and `str` should not be NULL");
u64 length = strlen(str); u64 length = strlen(str);
Str8 *output = wapp_str8_alloc_buf(allocator, length * 2); WpStr8 *output = wpStr8AllocBuf(allocator, length * 2);
if (!output) { if (!output) {
goto RETURN_ALLOC_CSTR; goto RETURN_ALLOC_CSTR;
} }
@@ -54,10 +54,10 @@ RETURN_ALLOC_CSTR:
return output; return output;
} }
Str8 *wapp_str8_alloc_str8(const Allocator *allocator, Str8RO *str) { WpStr8 *wpStr8AllocStr8(const WpAllocator *allocator, WpStr8RO *str) {
wapp_debug_assert(allocator != NULL && str != NULL, "`allocator` and `str` should not be NULL"); wpDebugAssert(allocator != NULL && str != NULL, "`allocator` and `str` should not be NULL");
Str8 *output = wapp_str8_alloc_buf(allocator, str->capacity); WpStr8 *output = wpStr8AllocBuf(allocator, str->capacity);
if (!output) { if (!output) {
goto RETURN_ALLOC_STR8; goto RETURN_ALLOC_STR8;
} }
@@ -69,10 +69,10 @@ RETURN_ALLOC_STR8:
return output; return output;
} }
Str8 *wapp_str8_alloc_substr(const Allocator *allocator, Str8RO *str, u64 start, u64 end) { WpStr8 *wpStr8AllocSubstr(const WpAllocator *allocator, WpStr8RO *str, u64 start, u64 end) {
wapp_debug_assert(allocator != NULL && str != NULL, "`allocator` and `str` should not be NULL"); wpDebugAssert(allocator != NULL && str != NULL, "`allocator` and `str` should not be NULL");
Str8 *output = NULL; WpStr8 *output = NULL;
if (start >= str->size || start >= end) { if (start >= str->size || start >= end) {
goto RETURN_ALLOC_SUBSTR; goto RETURN_ALLOC_SUBSTR;
@@ -82,7 +82,7 @@ Str8 *wapp_str8_alloc_substr(const Allocator *allocator, Str8RO *str, u64 start,
end = str->size; end = str->size;
} }
output = wapp_str8_alloc_buf(allocator, str->capacity); output = wpStr8AllocBuf(allocator, str->capacity);
if (!output) { if (!output) {
goto RETURN_ALLOC_SUBSTR; goto RETURN_ALLOC_SUBSTR;
} }
@@ -94,12 +94,12 @@ RETURN_ALLOC_SUBSTR:
return output; return output;
} }
void wapp_str8_dealloc_buf(const Allocator *allocator, Str8 **str) { void wpStr8DeallocBuf(const WpAllocator *allocator, WpStr8 **str) {
wapp_debug_assert(allocator != NULL && str != NULL && (*str) != NULL, "Either `allocator` is NULL or `str` is an invalid double pointer"); wpDebugAssert(allocator != NULL && str != NULL && (*str) != NULL, "Either `allocator` is NULL or `str` is an invalid double pointer");
wapp_mem_allocator_free(allocator, (void **)str, STR8_BUF_ALLOC_SIZE((*str)->capacity)); wpMemAllocatorFree(allocator, (void **)str, STR8_BUF_ALLOC_SIZE((*str)->capacity));
} }
c8 wapp_str8_get(const Str8 *str, u64 index) { c8 wpStr8Get(const WpStr8 *str, u64 index) {
if (index >= str->size) { if (index >= str->size) {
return '\0'; return '\0';
} }
@@ -107,7 +107,7 @@ c8 wapp_str8_get(const Str8 *str, u64 index) {
return str->buf[index]; return str->buf[index];
} }
void wapp_str8_set(Str8 *str, u64 index, c8 c) { void wpStr8Set(WpStr8 *str, u64 index, c8 c) {
if (index >= str->size) { if (index >= str->size) {
return; return;
} }
@@ -115,24 +115,29 @@ void wapp_str8_set(Str8 *str, u64 index, c8 c) {
str->buf[index] = c; str->buf[index] = c;
} }
void wapp_str8_push_back(Str8 *str, c8 c) { void wpStr8Clear(WpStr8 *str) {
memset(str->buf, 0, str->capacity);
str->size = 0;
}
void wpStr8PushBack(WpStr8 *str, c8 c) {
if (!(str->size < str->capacity)) { if (!(str->size < str->capacity)) {
return; return;
} }
u64 index = (str->size)++; u64 index = (str->size)++;
wapp_str8_set(str, index, c); wpStr8Set(str, index, c);
} }
b8 wapp_str8_equal(Str8RO *s1, Str8RO *s2) { b8 wpStr8Equal(WpStr8RO *s1, WpStr8RO *s2) {
if (s1->size != s2->size) { if (s1->size != s2->size) {
return false; return false;
} }
return wapp_str8_equal_to_count(s1, s2, s1->size); return wpStr8EqualToCount(s1, s2, s1->size);
} }
b8 wapp_str8_equal_to_count(Str8RO* s1, Str8RO* s2, u64 count) { b8 wpStr8EqualToCount(WpStr8RO* s1, WpStr8RO* s2, u64 count) {
if (!s1 || !s2) { if (!s1 || !s2) {
return false; return false;
} }
@@ -140,7 +145,7 @@ b8 wapp_str8_equal_to_count(Str8RO* s1, Str8RO* s2, u64 count) {
return memcmp(s1->buf, s2->buf, count) == 0; return memcmp(s1->buf, s2->buf, count) == 0;
} }
Str8 wapp_str8_slice(Str8RO *str, u64 start, u64 end) { WpStr8 wpStr8Slice(WpStr8RO *str, u64 start, u64 end) {
if (start >= str->size || start >= end) { if (start >= str->size || start >= end) {
start = str->size; start = str->size;
end = str->size; end = str->size;
@@ -150,17 +155,17 @@ Str8 wapp_str8_slice(Str8RO *str, u64 start, u64 end) {
end = str->size; end = str->size;
} }
return (Str8RO){ return (WpStr8RO){
.capacity = end - start, .capacity = end - start,
.size = end - start, .size = end - start,
.buf = str->buf + start, .buf = str->buf + start,
}; };
} }
Str8 *wapp_str8_alloc_concat(const Allocator *allocator, Str8 *dst, Str8RO *src) { WpStr8 *wpStr8AllocConcat(const WpAllocator *allocator, WpStr8 *dst, WpStr8RO *src) {
wapp_debug_assert(allocator != NULL && dst != NULL && src != NULL, "`allocator`, `dst` and `src` should not be NULL"); wpDebugAssert(allocator != NULL && dst != NULL && src != NULL, "`allocator`, `dst` and `src` should not be NULL");
Str8 *output = NULL; WpStr8 *output = NULL;
u64 remaining = dst->capacity - dst->size; u64 remaining = dst->capacity - dst->size;
if (src->size <= remaining) { if (src->size <= remaining) {
output = dst; output = dst;
@@ -169,22 +174,22 @@ Str8 *wapp_str8_alloc_concat(const Allocator *allocator, Str8 *dst, Str8RO *src)
u64 capacity = dst->capacity + src->size; u64 capacity = dst->capacity + src->size;
output = wapp_str8_alloc_buf(allocator, capacity); output = wpStr8AllocBuf(allocator, capacity);
if (!output) { if (!output) {
goto RETURN_STR8_CONCAT; goto RETURN_STR8_CONCAT;
} }
wapp_str8_concat_capped(output, dst); wpStr8ConcatCapped(output, dst);
SOURCE_STRING_STR8_CONCAT: SOURCE_STRING_STR8_CONCAT:
wapp_str8_concat_capped(output, src); wpStr8ConcatCapped(output, src);
RETURN_STR8_CONCAT: RETURN_STR8_CONCAT:
return output; return output;
} }
void wapp_str8_concat_capped(Str8 *dst, Str8RO *src) { void wpStr8ConcatCapped(WpStr8 *dst, WpStr8RO *src) {
wapp_debug_assert(dst != NULL && src != NULL, "`dst` and `src` should not be NULL"); wpDebugAssert(dst != NULL && src != NULL, "`dst` and `src` should not be NULL");
u64 remaining = dst->capacity - dst->size; u64 remaining = dst->capacity - dst->size;
u64 to_copy = remaining < src->size ? remaining : src->size; u64 to_copy = remaining < src->size ? remaining : src->size;
@@ -193,8 +198,8 @@ void wapp_str8_concat_capped(Str8 *dst, Str8RO *src) {
dst->size += to_copy; dst->size += to_copy;
} }
void wapp_str8_copy_cstr_capped(Str8 *dst, const char *src) { void wpStr8CopyCstrCapped(WpStr8 *dst, const char *src) {
wapp_debug_assert(dst != NULL && src != NULL, "`dst` and `src` should not be NULL"); wpDebugAssert(dst != NULL && src != NULL, "`dst` and `src` should not be NULL");
u64 length = strlen(src); u64 length = strlen(src);
u64 to_copy = length <= dst->capacity ? length : dst->capacity; u64 to_copy = length <= dst->capacity ? length : dst->capacity;
@@ -204,8 +209,8 @@ void wapp_str8_copy_cstr_capped(Str8 *dst, const char *src) {
dst->size = to_copy; dst->size = to_copy;
} }
void wapp_str8_copy_str8_capped(Str8 *dst, Str8RO *src) { void wpStr8CopyStr8Capped(WpStr8 *dst, WpStr8RO *src) {
wapp_debug_assert(dst != NULL && src != NULL, "`dst` and `src` should not be NULL"); wpDebugAssert(dst != NULL && src != NULL, "`dst` and `src` should not be NULL");
u64 to_copy = src->size <= dst->capacity ? src->size : dst->capacity; u64 to_copy = src->size <= dst->capacity ? src->size : dst->capacity;
@@ -214,8 +219,8 @@ void wapp_str8_copy_str8_capped(Str8 *dst, Str8RO *src) {
dst->size = to_copy; dst->size = to_copy;
} }
void wapp_str8_copy_to_cstr(char *dst, Str8RO *src, u64 dst_capacity) { void wpStr8CopyToCstr(char *dst, WpStr8RO *src, u64 dst_capacity) {
wapp_debug_assert(dst != NULL && src != NULL, "`dst` and `src` should not be NULL"); wpDebugAssert(dst != NULL && src != NULL, "`dst` and `src` should not be NULL");
u64 to_copy = src->size < dst_capacity ? src->size : dst_capacity - 1; u64 to_copy = src->size < dst_capacity ? src->size : dst_capacity - 1;
@@ -223,8 +228,8 @@ void wapp_str8_copy_to_cstr(char *dst, Str8RO *src, u64 dst_capacity) {
memcpy(dst, src->buf, to_copy); memcpy(dst, src->buf, to_copy);
} }
void wapp_str8_format(Str8 *dst, const char *format, ...) { void wpStr8Format(WpStr8 *dst, const char *format, ...) {
wapp_debug_assert(dst != NULL && format != NULL, "`dst` and `format` should not be NULL"); wpDebugAssert(dst != NULL && format != NULL, "`dst` and `format` should not be NULL");
va_list args1; va_list args1;
va_list args2; va_list args2;
@@ -241,9 +246,9 @@ void wapp_str8_format(Str8 *dst, const char *format, ...) {
va_end(args2); va_end(args2);
} }
void wapp_str8_to_lower(Str8 *dst, Str8RO *src) { void wpStr8ToLower(WpStr8 *dst, WpStr8RO *src) {
wapp_debug_assert(src != NULL && dst != NULL, "`dst` and `src` should not be NULL"); wpDebugAssert(src != NULL && dst != NULL, "`dst` and `src` should not be NULL");
wapp_debug_assert(dst->capacity >= src->capacity, "`dst` does not have enough capacity"); wpDebugAssert(dst->capacity >= src->capacity, "`dst` does not have enough capacity");
dst->size = src->size; dst->size = src->size;
@@ -252,15 +257,15 @@ void wapp_str8_to_lower(Str8 *dst, Str8RO *src) {
u64 index = 0; u64 index = 0;
b8 running = true; b8 running = true;
while (running) { while (running) {
wapp_str8_set(dst, index, (u8)tolower(wapp_str8_get(src, index))); wpStr8Set(dst, index, (u8)tolower(wpStr8Get(src, index)));
++index; ++index;
running = index < src->size; running = index < src->size;
} }
} }
void wapp_str8_to_upper(Str8 *dst, Str8RO *src) { void wpStr8ToUpper(WpStr8 *dst, WpStr8RO *src) {
wapp_debug_assert(src != NULL && dst != NULL, "`dst` and `src` should not be NULL"); wpDebugAssert(src != NULL && dst != NULL, "`dst` and `src` should not be NULL");
wapp_debug_assert(dst->capacity >= src->capacity, "`dst` does not have enough capacity"); wpDebugAssert(dst->capacity >= src->capacity, "`dst` does not have enough capacity");
dst->size = src->size; dst->size = src->size;
@@ -269,24 +274,24 @@ void wapp_str8_to_upper(Str8 *dst, Str8RO *src) {
u64 index = 0; u64 index = 0;
b8 running = true; b8 running = true;
while (running) { while (running) {
wapp_str8_set(dst, index, (u8)toupper(wapp_str8_get(src, index))); wpStr8Set(dst, index, (u8)toupper(wpStr8Get(src, index)));
++index; ++index;
running = index < src->size; running = index < src->size;
} }
} }
void wapp_str8_from_bytes(Str8 *dst, const U8Array src) { void wpStr8FromBytes(WpStr8 *dst, const WpU8Array src) {
wapp_debug_assert(src != NULL && dst != NULL, "`dst` and `src` should not be NULL"); wpDebugAssert(src != NULL && dst != NULL, "`dst` and `src` should not be NULL");
u64 size = wapp_array_count(src) * wapp_array_item_size(src); u64 size = wpArrayCount(src) * wpArrayItemSize(src);
wapp_debug_assert(dst->capacity >= size, "`dst` does not have enough capacity"); wpDebugAssert(dst->capacity >= size, "`dst` does not have enough capacity");
dst->size = size; dst->size = size;
memcpy(dst->buf, src, size); memcpy(dst->buf, src, size);
} }
i64 wapp_str8_find(Str8RO *str, Str8RO substr) { i64 wpStr8Find(WpStr8RO *str, WpStr8RO substr) {
if (!str || substr.size > str->size) { if (!str || substr.size > str->size) {
return -1; return -1;
} }
@@ -308,7 +313,7 @@ i64 wapp_str8_find(Str8RO *str, Str8RO substr) {
return -1; return -1;
} }
i64 wapp_str8_rfind(Str8RO *str, Str8RO substr) { i64 wpStr8Rfind(WpStr8RO *str, WpStr8RO substr) {
if (!str || substr.size > str->size) { if (!str || substr.size > str->size) {
return -1; return -1;
} }
@@ -330,15 +335,15 @@ i64 wapp_str8_rfind(Str8RO *str, Str8RO substr) {
return -1; return -1;
} }
Str8List *wapp_str8_split_with_max(const Allocator *allocator, Str8RO *str, Str8RO *delimiter, i64 max_splits) { WpStr8List *wpStr8SplitWithMax(const WpAllocator *allocator, WpStr8RO *str, WpStr8RO *delimiter, i64 max_splits) {
wapp_debug_assert(allocator != NULL && str != NULL && delimiter != NULL, "`allocator`, `str` and `delimiter` should not be NULL"); wpDebugAssert(allocator != NULL && str != NULL && delimiter != NULL, "`allocator`, `str` and `delimiter` should not be NULL");
Str8List *output = wapp_dbl_list_alloc(Str8, allocator); WpStr8List *output = wpDblListAlloc(WpStr8, allocator);
if (delimiter->size > str->size) { if (delimiter->size > str->size) {
Str8 *full = wapp_str8_alloc_str8(allocator, str); WpStr8 *full = wpStr8AllocStr8(allocator, str);
if (full) { if (full) {
wapp_dbl_list_push_back_alloc(Str8, allocator, output, full); wpDblListPushBackAlloc(WpStr8, allocator, output, full);
} }
goto RETURN_STR8_SPLIT; goto RETURN_STR8_SPLIT;
@@ -347,45 +352,45 @@ Str8List *wapp_str8_split_with_max(const Allocator *allocator, Str8RO *str, Str8
i64 start = 0; i64 start = 0;
i64 end = 0; i64 end = 0;
i64 splits = 0; i64 splits = 0;
Str8 *rest = wapp_str8_alloc_str8(allocator, str); WpStr8 *rest = wpStr8AllocStr8(allocator, str);
Str8 *before_str; WpStr8 *before_str;
while ((end = wapp_str8_find(rest, *delimiter)) != -1) { while ((end = wpStr8Find(rest, *delimiter)) != -1) {
if (max_splits > 0 && splits >= max_splits) { if (max_splits > 0 && splits >= max_splits) {
break; break;
} }
before_str = wapp_str8_alloc_substr(allocator, str, start, start + end); before_str = wpStr8AllocSubstr(allocator, str, start, start + end);
if (before_str) { if (before_str) {
wapp_dbl_list_push_back_alloc(Str8, allocator, output, before_str); wpDblListPushBackAlloc(WpStr8, allocator, output, before_str);
} }
wapp_mem_allocator_free(allocator, (void **)&rest, sizeof(Str8)); wpMemAllocatorFree(allocator, (void **)&rest, sizeof(WpStr8));
rest = wapp_str8_alloc_substr(allocator, str, start + end + delimiter->size, str->size); rest = wpStr8AllocSubstr(allocator, str, start + end + delimiter->size, str->size);
start += end + delimiter->size; start += end + delimiter->size;
++splits; ++splits;
} }
// Ensure the last part of the string after the delimiter is added to the list // Ensure the last part of the string after the delimiter is added to the list
rest = wapp_str8_alloc_substr(allocator, str, start, str->size); rest = wpStr8AllocSubstr(allocator, str, start, str->size);
if (rest) { if (rest) {
wapp_dbl_list_push_back_alloc(Str8, allocator, output, rest); wpDblListPushBackAlloc(WpStr8, allocator, output, rest);
} }
RETURN_STR8_SPLIT: RETURN_STR8_SPLIT:
return output; return output;
} }
Str8List *wapp_str8_rsplit_with_max(const Allocator *allocator, Str8RO *str, Str8RO *delimiter, i64 max_splits) { WpStr8List *wpStr8RsplitWithMax(const WpAllocator *allocator, WpStr8RO *str, WpStr8RO *delimiter, i64 max_splits) {
wapp_debug_assert(allocator != NULL && str != NULL && delimiter != NULL, "`allocator`, `str` and `delimiter` should not be NULL"); wpDebugAssert(allocator != NULL && str != NULL && delimiter != NULL, "`allocator`, `str` and `delimiter` should not be NULL");
Str8List *output = wapp_dbl_list_alloc(Str8, allocator); WpStr8List *output = wpDblListAlloc(WpStr8, allocator);
if (delimiter->size > str->size) { if (delimiter->size > str->size) {
Str8 *full = wapp_str8_alloc_str8(allocator, str); WpStr8 *full = wpStr8AllocStr8(allocator, str);
if (full) { if (full) {
wapp_dbl_list_push_back_alloc(Str8, allocator, output, full); wpDblListPushBackAlloc(WpStr8, allocator, output, full);
} }
goto RETURN_STR8_SPLIT; goto RETURN_STR8_SPLIT;
@@ -393,58 +398,58 @@ Str8List *wapp_str8_rsplit_with_max(const Allocator *allocator, Str8RO *str, Str
i64 end = 0; i64 end = 0;
i64 splits = 0; i64 splits = 0;
Str8 *rest = wapp_str8_alloc_str8(allocator, str); WpStr8 *rest = wpStr8AllocStr8(allocator, str);
Str8 *after_str; WpStr8 *after_str;
while ((end = wapp_str8_rfind(rest, *delimiter)) != -1) { while ((end = wpStr8Rfind(rest, *delimiter)) != -1) {
if (max_splits > 0 && splits >= max_splits) { if (max_splits > 0 && splits >= max_splits) {
break; break;
} }
after_str = wapp_str8_alloc_substr(allocator, rest, end + delimiter->size, str->size); after_str = wpStr8AllocSubstr(allocator, rest, end + delimiter->size, str->size);
if (after_str) { if (after_str) {
wapp_dbl_list_push_front_alloc(Str8, allocator, output, after_str); wpDblListPushFrontAlloc(WpStr8, allocator, output, after_str);
} }
wapp_mem_allocator_free(allocator, (void **)&rest, sizeof(Str8)); wpMemAllocatorFree(allocator, (void **)&rest, sizeof(WpStr8));
rest = wapp_str8_alloc_substr(allocator, rest, 0, end); rest = wpStr8AllocSubstr(allocator, rest, 0, end);
++splits; ++splits;
} }
rest = wapp_str8_alloc_substr(allocator, str, 0, rest->size); rest = wpStr8AllocSubstr(allocator, str, 0, rest->size);
if (rest) { if (rest) {
wapp_dbl_list_push_front_alloc(Str8, allocator, output, rest); wpDblListPushFrontAlloc(WpStr8, allocator, output, rest);
} }
RETURN_STR8_SPLIT: RETURN_STR8_SPLIT:
return output; return output;
} }
Str8 *wapp_str8_join(const Allocator *allocator, const Str8List *list, Str8RO *delimiter) { WpStr8 *wpStr8Join(const WpAllocator *allocator, const WpStr8List *list, WpStr8RO *delimiter) {
wapp_debug_assert(allocator != NULL && list != NULL && delimiter != NULL, "`allocator`, `list` and `delimiter` should not be NULL"); wpDebugAssert(allocator != NULL && list != NULL && delimiter != NULL, "`allocator`, `list` and `delimiter` should not be NULL");
u64 capacity = wapp_str8_list_total_size(list) + (delimiter->size * (list->node_count - 1)); u64 capacity = wpStr8ListTotalSize(list) + (delimiter->size * (list->node_count - 1));
Str8 *output = wapp_str8_alloc_buf(allocator, capacity * 2); WpStr8 *output = wpStr8AllocBuf(allocator, capacity * 2);
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of // NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
// MSVC Spectre mitigation warnings // MSVC Spectre mitigation warnings
Str8 *node; WpStr8 *node;
u64 node_index = 0; u64 node_index = 0;
b8 running = node_index < list->node_count; b8 running = node_index < list->node_count;
while (running) { while (running) {
node = wapp_dbl_list_get(Str8, list, node_index); node = wpDblListGet(WpStr8, list, node_index);
if (!node) { if (!node) {
break; break;
} }
wapp_str8_concat_capped(output, node); wpStr8ConcatCapped(output, node);
// NOTE (Abdelrahman): Comparison extracted to variable to silence // NOTE (Abdelrahman): Comparison extracted to variable to silence
// MSVC Spectre mitigation warnings // MSVC Spectre mitigation warnings
b8 not_last = node_index + 1 < list->node_count; b8 not_last = node_index + 1 < list->node_count;
if (not_last) { if (not_last) {
wapp_str8_concat_capped(output, delimiter); wpStr8ConcatCapped(output, delimiter);
} }
++node_index; ++node_index;
@@ -454,19 +459,19 @@ Str8 *wapp_str8_join(const Allocator *allocator, const Str8List *list, Str8RO *d
return output; return output;
} }
u64 wapp_str8_list_total_size(const Str8List *list) { u64 wpStr8ListTotalSize(const WpStr8List *list) {
if (!list) { if (!list) {
return 0; return 0;
} }
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of // NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
// MSVC Spectre mitigation warnings // MSVC Spectre mitigation warnings
Str8 *node; WpStr8 *node;
u64 node_index = 0; u64 node_index = 0;
u64 output = 0; u64 output = 0;
b8 running = node_index < list->node_count; b8 running = node_index < list->node_count;
while (running) { while (running) {
node = wapp_dbl_list_get(Str8, list, node_index); node = wpDblListGet(WpStr8, list, node_index);
if (!node) { if (!node) {
break; break;
} }
+71 -70
View File
@@ -11,120 +11,121 @@
#include "../../mem/allocator/mem_allocator.h" #include "../../mem/allocator/mem_allocator.h"
#include <string.h> #include <string.h>
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
typedef struct Str8 Str8; typedef struct WpStr8 WpStr8;
struct Str8 { struct WpStr8 {
u64 capacity; u64 capacity;
u64 size; u64 size;
c8 *buf; c8 *buf;
}; };
typedef const Str8 Str8RO; typedef const WpStr8 WpStr8RO;
/** /**
* Utilities to be used with printf functions * Utilities to be used with printf functions
*/ */
#define WAPP_STR8_SPEC "%.*s" #define WP_STR8_SPEC ".*s"
#define wapp_str8_varg(STRING) (int)((STRING).size), (STRING).buf #define wpStr8Varg(STRING) (int)((STRING).size), (STRING).buf
/** /**
* Str8 stack buffers * WpStr8 stack buffers
*/ */
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
// Uses a lambda to achieve the same behaviour achieved by the C macro // Uses a lambda to achieve the same behaviour achieved by the C macro
#define wapp_str8_buf(CAPACITY) ([&](){ \ #define wpStr8Buf(CAPACITY) ([&](){ \
wapp_persist c8 buf[CAPACITY] = {}; \ wp_persist c8 buf[CAPACITY] = {}; \
memset(buf, 0, CAPACITY); \ memset(buf, 0, CAPACITY); \
return Str8{CAPACITY, 0, buf}; \ return WpStr8{CAPACITY, 0, buf}; \
}()) }())
// Uses a lambda to achieve the same behaviour achieved by the C macro // Uses a lambda to achieve the same behaviour achieved by the C macro
#define wapp_str8_lit(STRING) ([&]() { \ #define wpStr8Lit(STRING) ([&]() { \
wapp_persist c8 buf[sizeof(STRING) * 2] = {}; \ wp_persist c8 buf[sizeof(STRING) * 2] = {}; \
memcpy(buf, STRING, sizeof(STRING)); \ memcpy(buf, STRING, sizeof(STRING)); \
return Str8{(sizeof(STRING) - 1) * 2, sizeof(STRING) - 1, buf}; \ return WpStr8{(sizeof(STRING) - 1) * 2, sizeof(STRING) - 1, buf}; \
}()) }())
#define wapp_str8_lit_ro(STRING) Str8RO{sizeof(STRING) - 1, sizeof(STRING) - 1, (c8 *)STRING} #define wpStr8LitRo(STRING) WpStr8RO{sizeof(STRING) - 1, sizeof(STRING) - 1, (c8 *)STRING}
#define wapp_str8_lit_ro_initialiser_list(STRING) {sizeof(STRING) - 1, sizeof(STRING) - 1, (c8 *)STRING} #define wpStr8LitRoInitialiserList(STRING) {sizeof(STRING) - 1, sizeof(STRING) - 1, (c8 *)STRING}
#else #else
#define wapp_str8_buf(CAPACITY) ((Str8){.capacity = CAPACITY, .size = 0, .buf = (c8[CAPACITY]){0}}) #define wpStr8Buf(CAPACITY) ((WpStr8){.capacity = CAPACITY, .size = 0, .buf = (c8[CAPACITY]){0}})
// Utilises the fact that memcpy returns pointer to dest buffer and that getting // Utilises the fact that memcpy returns pointer to dest buffer and that getting
// address of compound literals is valid in C to create a string on the stack // address of compound literals is valid in C to create a string on the stack
#define wapp_str8_lit(STRING) ((Str8){.capacity = (sizeof(STRING) - 1) * 2, \ #define wpStr8Lit(STRING) ((WpStr8){.capacity = (sizeof(STRING) - 1) * 2, \
.size = sizeof(STRING) - 1, \ .size = sizeof(STRING) - 1, \
.buf = memcpy(&((c8 [sizeof(STRING) * 2]){0}), \ .buf = memcpy(&((c8 [sizeof(STRING) * 2]){0}), \
STRING, \ STRING, \
sizeof(STRING))}) sizeof(STRING))})
#define wapp_str8_lit_ro(STRING) ((Str8RO){.capacity = sizeof(STRING) - 1, \ #define wpStr8LitRo(STRING) ((WpStr8RO){.capacity = sizeof(STRING) - 1, \
.size = sizeof(STRING) - 1, \ .size = sizeof(STRING) - 1, \
.buf = (c8 *)STRING}) .buf = (c8 *)STRING})
// To be used only when initialising a static storage variable in compilers that don't support // To be used only when initialising a static storage variable in compilers that don't support
// initialisers with the syntax of wapp_str8_lit_ro (e.g. gcc). Should only be used when necessary // initialisers with the syntax of wpStr8LitRo (e.g. gcc). Should only be used when necessary
// and only be assigned to a Str8RO variable to avoid any attempt at modifying the string // and only be assigned to a WpStr8RO variable to avoid any attempt at modifying the string
#define wapp_str8_lit_ro_initialiser_list(STRING) {.capacity = sizeof(STRING) - 1, \ #define wpStr8LitRoInitialiserList(STRING) {.capacity = sizeof(STRING) - 1, \
.size = sizeof(STRING) - 1, \ .size = sizeof(STRING) - 1, \
.buf = (c8 *)STRING} .buf = (c8 *)STRING}
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
/** /**
* Str8 allocated buffers * WpStr8 allocated buffers
*/ */
Str8 *wapp_str8_alloc_buf(const Allocator *allocator, u64 capacity); WpStr8 *wpStr8AllocBuf(const WpAllocator *allocator, u64 capacity);
Str8 *wapp_str8_alloc_and_fill_buf(const Allocator *allocator, u64 capacity); WpStr8 *wpStr8AllocAndFillBuf(const WpAllocator *allocator, u64 capacity);
Str8 *wapp_str8_alloc_cstr(const Allocator *allocator, const char *str); WpStr8 *wpStr8AllocCstr(const WpAllocator *allocator, const char *str);
Str8 *wapp_str8_alloc_str8(const Allocator *allocator, Str8RO *str); WpStr8 *wpStr8AllocStr8(const WpAllocator *allocator, WpStr8RO *str);
Str8 *wapp_str8_alloc_substr(const Allocator *allocator, Str8RO *str, u64 start, u64 end); WpStr8 *wpStr8AllocSubstr(const WpAllocator *allocator, WpStr8RO *str, u64 start, u64 end);
Str8 *wapp_str8_alloc_concat(const Allocator *allocator, Str8 *dst, Str8RO *src); WpStr8 *wpStr8AllocConcat(const WpAllocator *allocator, WpStr8 *dst, WpStr8RO *src);
// Only needed for allocators like malloc where each allocation has to be freed on its own. // Only needed for allocators like malloc where each allocation has to be freed on its own.
// No need to use it for allocators like Arena. // No need to use it for allocators like Arena.
void wapp_str8_dealloc_buf(const Allocator *allocator, Str8 **str); void wpStr8DeallocBuf(const WpAllocator *allocator, WpStr8 **str);
/** /**
* Str8 utilities * WpStr8 utilities
*/ */
c8 wapp_str8_get(Str8RO *str, u64 index); c8 wpStr8Get(WpStr8RO *str, u64 index);
void wapp_str8_set(Str8 *str, u64 index, c8 c); void wpStr8Set(WpStr8 *str, u64 index, c8 c);
void wapp_str8_push_back(Str8 *str, c8 c); void wpStr8Clear(WpStr8 *str);
b8 wapp_str8_equal(Str8RO *s1, Str8RO *s2); void wpStr8PushBack(WpStr8 *str, c8 c);
b8 wapp_str8_equal_to_count(Str8RO* s1, Str8RO* s2, u64 count); b8 wpStr8Equal(WpStr8RO *s1, WpStr8RO *s2);
Str8 wapp_str8_slice(Str8RO *str, u64 start, u64 end); b8 wpStr8EqualToCount(WpStr8RO* s1, WpStr8RO* s2, u64 count);
void wapp_str8_concat_capped(Str8 *dst, Str8RO *src); WpStr8 wpStr8Slice(WpStr8RO *str, u64 start, u64 end);
void wapp_str8_copy_cstr_capped(Str8 *dst, const char *src); void wpStr8ConcatCapped(WpStr8 *dst, WpStr8RO *src);
void wapp_str8_copy_str8_capped(Str8 *dst, Str8RO *src); void wpStr8CopyCstrCapped(WpStr8 *dst, const char *src);
void wapp_str8_copy_to_cstr(char *dst, Str8RO *src, u64 dst_capacity); void wpStr8CopyStr8Capped(WpStr8 *dst, WpStr8RO *src);
void wapp_str8_format(Str8 *dst, const char *format, ...); void wpStr8CopyToCstr(char *dst, WpStr8RO *src, u64 dst_capacity);
void wapp_str8_to_lower(Str8 *dst, Str8RO *src); void wpStr8Format(WpStr8 *dst, const char *format, ...);
void wapp_str8_to_upper(Str8 *dst, Str8RO *src); void wpStr8ToLower(WpStr8 *dst, WpStr8RO *src);
void wapp_str8_from_bytes(Str8 *dst, const U8Array src); void wpStr8ToUpper(WpStr8 *dst, WpStr8RO *src);
void wpStr8FromBytes(WpStr8 *dst, const WpU8Array src);
/** /**
* Str8 find functions * WpStr8 find functions
*/ */
i64 wapp_str8_find(Str8RO *str, Str8RO substr); i64 wpStr8Find(WpStr8RO *str, WpStr8RO substr);
i64 wapp_str8_rfind(Str8RO *str, Str8RO substr); i64 wpStr8Rfind(WpStr8RO *str, WpStr8RO substr);
/** /**
* Str8 split and join * WpStr8 split and join
*/ */
#define wapp_str8_split(ALLOCATOR, STR, DELIMITER) wapp_str8_split_with_max(ALLOCATOR, STR, DELIMITER, -1) #define wpStr8Split(ALLOCATOR, STR, DELIMITER) wpStr8SplitWithMax(ALLOCATOR, STR, DELIMITER, -1)
#define wapp_str8_rsplit(ALLOCATOR, STR, DELIMITER) wapp_str8_rsplit_with_max(ALLOCATOR, STR, DELIMITER, -1) #define wpStr8Rsplit(ALLOCATOR, STR, DELIMITER) wpStr8RsplitWithMax(ALLOCATOR, STR, DELIMITER, -1)
Str8List *wapp_str8_split_with_max(const Allocator *allocator, Str8RO *str, Str8RO *delimiter, i64 max_splits); WpStr8List *wpStr8SplitWithMax(const WpAllocator *allocator, WpStr8RO *str, WpStr8RO *delimiter, i64 max_splits);
Str8List *wapp_str8_rsplit_with_max(const Allocator *allocator, Str8RO *str, Str8RO *delimiter, i64 max_splits); WpStr8List *wpStr8RsplitWithMax(const WpAllocator *allocator, WpStr8RO *str, WpStr8RO *delimiter, i64 max_splits);
Str8 *wapp_str8_join(const Allocator *allocator, const Str8List *list, Str8RO *delimiter); WpStr8 *wpStr8Join(const WpAllocator *allocator, const WpStr8List *list, WpStr8RO *delimiter);
/** /**
* Str8 list utilities * WpStr8 list utilities
*/ */
u64 wapp_str8_list_total_size(const Str8List *list); u64 wpStr8ListTotalSize(const WpStr8List *list);
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !STR8_H #endif // !STR8_H
+7
View File
@@ -6,7 +6,14 @@
#include "wapp_base.h" #include "wapp_base.h"
#include "array/array.c" #include "array/array.c"
#include "dbl_list/dbl_list.c" #include "dbl_list/dbl_list.c"
#include "hash/hasher/hasher.c"
#include "hash/hasher/murmur3.c"
#include "hash/hasher/siphash.c"
#include "hash/table/table.c"
#include "hash/set/set.c"
#include "hash/map/map.c"
#include "queue/queue.c" #include "queue/queue.c"
#include "stream/stream.c"
#include "mem/allocator/mem_allocator.c" #include "mem/allocator/mem_allocator.c"
#include "mem/utils/mem_utils.c" #include "mem/utils/mem_utils.c"
#include "strings/str8/str8.c" #include "strings/str8/str8.c"
+7
View File
@@ -5,7 +5,14 @@
#include "array/array.h" #include "array/array.h"
#include "dbl_list/dbl_list.h" #include "dbl_list/dbl_list.h"
#include "hash/hasher/hasher.h"
#include "hash/hasher/murmur3.h"
#include "hash/hasher/siphash.h"
#include "hash/table/table.h"
#include "hash/set/set.h"
#include "hash/map/map.h"
#include "queue/queue.h" #include "queue/queue.h"
#include "stream/stream.h"
#include "mem/allocator/mem_allocator.h" #include "mem/allocator/mem_allocator.h"
#include "mem/utils/mem_utils.h" #include "mem/utils/mem_utils.h"
#include "strings/str8/str8.h" #include "strings/str8/str8.h"
+23 -13
View File
@@ -6,14 +6,14 @@
#include "../platform/platform.h" #include "../platform/platform.h"
#include <stdint.h> #include <stdint.h>
#if defined(WAPP_PLATFORM_C) && WAPP_PLATFORM_C_VERSION >= WAPP_PLATFORM_C11_VERSION && !defined(WAPP_PLATFORM_APPLE) #if defined(WP_PLATFORM_C) && WP_PLATFORM_C_VERSION >= WP_PLATFORM_C11_VERSION && !defined(WP_PLATFORM_APPLE)
#include <uchar.h> #include <uchar.h>
#if WAPP_PLATFORM_C_VERSION >= WAPP_PLATFORM_C23_VERSION #if WP_PLATFORM_C_VERSION >= WP_PLATFORM_C23_VERSION
typedef char8_t c8; typedef char8_t c8;
#else #else
typedef uint8_t c8; typedef uint8_t c8;
#endif // !WAPP_PLATFORM_C23_VERSION #endif // !WP_PLATFORM_C23_VERSION
typedef char16_t c16; typedef char16_t c16;
typedef char32_t c32; typedef char32_t c32;
@@ -21,16 +21,21 @@
typedef uint8_t c8; typedef uint8_t c8;
typedef uint16_t c16; typedef uint16_t c16;
typedef uint32_t c32; typedef uint32_t c32;
#endif // !WAPP_PLATFORM_C #endif // !WP_PLATFORM_C
typedef uint8_t u8; typedef uint8_t u8;
typedef uint16_t u16; typedef uint16_t u16;
typedef uint32_t u32; typedef uint32_t u32;
typedef uint64_t u64; typedef uint64_t u64;
#define wpU8Const UINT8_C
#define wpU16Const UINT16_C
#define wpU32Const UINT32_C
#define wpU64Const UINT64_C
typedef uint8_t b8; typedef uint8_t b8;
#ifndef WAPP_PLATFORM_CPP #ifndef WP_PLATFORM_CPP
#ifndef false #ifndef false
#define false (b8)0 #define false (b8)0
@@ -40,13 +45,18 @@ typedef uint8_t b8;
#define true (b8)1 #define true (b8)1
#endif // !true #endif // !true
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
typedef int8_t i8; typedef int8_t i8;
typedef int16_t i16; typedef int16_t i16;
typedef int32_t i32; typedef int32_t i32;
typedef int64_t i64; typedef int64_t i64;
#define wpI8Const INT8_C
#define wpI16Const INT16_C
#define wpI32Const INT32_C
#define wpI64Const INT64_C
typedef float f32; typedef float f32;
typedef double f64; typedef double f64;
typedef long double f128; typedef long double f128;
@@ -54,14 +64,14 @@ typedef long double f128;
typedef uintptr_t uptr; typedef uintptr_t uptr;
typedef intptr_t iptr; typedef intptr_t iptr;
#define wapp_extern extern #define wp_extern extern
#define wapp_intern static #define wp_intern static
#define wapp_persist static #define wp_persist static
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
#define wapp_class_mem static #define wp_class_mem static
#define BEGIN_C_LINKAGE wapp_extern "C" { #define BEGIN_C_LINKAGE wp_extern "C" {
#define END_C_LINKAGE } #define END_C_LINKAGE }
#endif // WAPP_PLATFORM_CPP #endif // WP_PLATFORM_CPP
#endif // !ALIASES_H #endif // !ALIASES_H
+18 -18
View File
@@ -9,42 +9,42 @@
#include <stdlib.h> #include <stdlib.h>
#include <inttypes.h> #include <inttypes.h>
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#define wapp_static_assert(EXPR, MSG) wapp_extern char ASSERTION_FAILED[EXPR ? 1 : -1] #define wpStaticAssert(EXPR, MSG) wp_extern char ASSERTION_FAILED[EXPR ? 1 : -1]
#ifndef WAPP_NO_RUNTIME_ASSERT #ifndef WP_NO_RUNTIME_ASSERT
#define wapp_runtime_assert(EXPR, MSG) __wapp_runtime_assert(EXPR, MSG) #define wpRuntimeAssert(EXPR, MSG) runtimeAssert(EXPR, MSG)
#else #else
#define wapp_runtime_assert(EXPR, MSG) #define wpRuntimeAssert(EXPR, MSG)
#endif #endif
#ifdef WAPP_DEBUG_ASSERT #ifdef WP_DEBUG_ASSERT
#define wapp_debug_assert(EXPR, MSG) wapp_runtime_assert(EXPR, MSG) #define wpDebugAssert(EXPR, MSG) wpRuntimeAssert(EXPR, MSG)
#else #else
#define wapp_debug_assert(EXPR, MSG) #define wpDebugAssert(EXPR, MSG)
#endif #endif
#ifdef WAPP_PLATFORM_WINDOWS #ifdef WP_PLATFORM_WINDOWS
#define __wapp_runtime_assert(EXPR, MSG) do { \ #define runtimeAssert(EXPR, MSG) do { \
__pragma(warning(push)) \ __pragma(warning(push)) \
__pragma(warning(disable:4127)) \ __pragma(warning(disable:4127)) \
if (!(EXPR)) { \ if (!(EXPR)) { \
__pragma(warning(pop)) \ __pragma(warning(pop)) \
__runtime_assert_failed(EXPR, MSG); \ runtimeAssertFailed(EXPR, MSG); \
} \ } \
} while(false) } while(false)
#else #else
#define __wapp_runtime_assert(EXPR, MSG) do { \ #define runtimeAssert(EXPR, MSG) do { \
if (!(EXPR)) { \ if (!(EXPR)) { \
__runtime_assert_failed(EXPR, MSG); \ runtimeAssertFailed(EXPR, MSG); \
} \ } \
} while(false) } while(false)
#endif // !WAPP_PLATFORM_WINDOWS #endif // !WP_PLATFORM_WINDOWS
#define __runtime_assert_failed(EXPR, MSG) do { \ #define runtimeAssertFailed(EXPR, MSG) do { \
fprintf( \ fprintf( \
stderr, \ stderr, \
"%s:%d (In function `%s`): Assertion failed (%" PRIu32 ")\nDiagnostic: %s\n\n", \ "%s:%d (In function `%s`): Assertion failed (%" PRIu32 ")\nDiagnostic: %s\n\n", \
@@ -54,8 +54,8 @@ BEGIN_C_LINKAGE
abort(); \ abort(); \
} while(false) } while(false)
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !WAPP_ASSERT_H #endif // !WAPP_ASSERT_H
+34 -25
View File
@@ -5,9 +5,9 @@
#include "../aliases/aliases.h" #include "../aliases/aliases.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#define KiB(SIZE) (((u64)SIZE) << 10) #define KiB(SIZE) (((u64)SIZE) << 10)
#define MiB(SIZE) (((u64)SIZE) << 20) #define MiB(SIZE) (((u64)SIZE) << 20)
@@ -23,41 +23,50 @@ BEGIN_C_LINKAGE
#define PB(SIZE) (TB(SIZE) * 1000llu) #define PB(SIZE) (TB(SIZE) * 1000llu)
#define EB(SIZE) (PB(SIZE) * 1000llu) #define EB(SIZE) (PB(SIZE) * 1000llu)
#define wapp_misc_utils_reserve_padding(SIZE) u8 reserved_padding[sizeof(void *) - ((SIZE) % sizeof(void *))] #define wpMiscUtilsReservePadding(SIZE) u8 reserved_padding[sizeof(void *) - ((SIZE) % sizeof(void *))]
#define U64_RSHIFT_OR_1(X) (((u64)X) | (((u64)X) >> 1)) #define U64_RSHIFT_OR_1(X) (((u64)X) | (((u64)X) >> 1))
#define U64_RSHIFT_OR_2(X) (((u64)X) | (((u64)X) >> 2)) #define U64_RSHIFT_OR_2(X) (((u64)X) | (((u64)X) >> 2))
#define U64_RSHIFT_OR_4(X) (((u64)X) | (((u64)X) >> 4)) #define U64_RSHIFT_OR_4(X) (((u64)X) | (((u64)X) >> 4))
#define U64_RSHIFT_OR_8(X) (((u64)X) | (((u64)X) >> 8)) #define U64_RSHIFT_OR_8(X) (((u64)X) | (((u64)X) >> 8))
#define U64_RSHIFT_OR_16(X) (((u64)X) | (((u64)X) >> 16)) #define U64_RSHIFT_OR_16(X) (((u64)X) | (((u64)X) >> 16))
#define U64_RSHIFT_OR_32(X) (((u64)X) | (((u64)X) >> 32)) #define U64_RSHIFT_OR_32(X) (((u64)X) | (((u64)X) >> 32))
#define wapp_misc_utils_u64_round_up_pow2(X) ( \ #define wpMiscUtilsU64RoundUpPow2(X) ( \
( \ ( \
U64_RSHIFT_OR_32( \ U64_RSHIFT_OR_32( \
U64_RSHIFT_OR_16( \ U64_RSHIFT_OR_16( \
U64_RSHIFT_OR_8( \ U64_RSHIFT_OR_8( \
U64_RSHIFT_OR_4( \ U64_RSHIFT_OR_4( \
U64_RSHIFT_OR_2( \ U64_RSHIFT_OR_2( \
U64_RSHIFT_OR_1(X - 1) \ U64_RSHIFT_OR_1(X - 1) \
) \ ) \
) \ ) \
) \ ) \
) \ ) \
) \ ) \
) + 1 \ ) + 1 \
) )
#define wapp_is_power_of_two(NUM) ((NUM & (NUM - 1)) == 0) #define wpMiscUtilsIsPowerOfTwo(NUM) ((NUM & (NUM - 1)) == 0)
#define wapp_pointer_offset(PTR, OFFSET) ((void *)((uptr)(PTR) + (OFFSET))) #define wpMiscUtilsOffsetPointer(PTR, OFFSET) ((void *)((uptr)(PTR) + (OFFSET)))
#define wpMiscUtilsSwap(TYPE, A_PTR, B_PTR) do { \
TYPE tmp = *(A_PTR); \
*(A_PTR) = *(B_PTR); \
*(B_PTR) = tmp; \
} while(0)
#ifdef WAPP_PLATFORM_CPP wp_intern inline u64 wpMiscUtilsRotl64(u64 x, i8 rotation) {
return (x << rotation) | (x >> (64 - rotation));
}
#ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#include <tuple> #include <tuple>
#define wapp_misc_utils_va_args_count(T, ...) (std::tuple_size<decltype(std::make_tuple(__VA_ARGS__))>::value) #define wpMiscUtilsVaArgsCount(T, ...) (std::tuple_size<decltype(std::make_tuple(__VA_ARGS__))>::value)
#else #else
#define wapp_misc_utils_va_args_count(T, ...) (sizeof((T[]){__VA_ARGS__})/sizeof(T)) #define wpMiscUtilsVaArgsCount(T, ...) (sizeof((T[]){__VA_ARGS__})/sizeof(T))
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !MISC_UTILS_H #endif // !MISC_UTILS_H
+104 -70
View File
@@ -3,111 +3,145 @@
#ifndef PLATFORM_H #ifndef PLATFORM_H
#define PLATFORM_H #define PLATFORM_H
// Operating system
#if defined(__ANDROID__) #if defined(__ANDROID__)
#define WAPP_PLATFORM_ANDROID #define WP_PLATFORM_ANDROID
#define WAPP_PLATFORM_POSIX #define WP_PLATFORM_POSIX
#elif defined(__FreeBSD__) #elif defined(__FreeBSD__)
#define WAPP_PLATFORM_FREE_BSD #define WP_PLATFORM_FREE_BSD
#define WAPP_PLATFORM_BSD #define WP_PLATFORM_BSD
#define WAPP_PLATFORM_POSIX #define WP_PLATFORM_POSIX
#elif defined(__NetBSD__) #elif defined(__NetBSD__)
#define WAPP_PLATFORM_NET_BSD #define WP_PLATFORM_NET_BSD
#define WAPP_PLATFORM_BSD #define WP_PLATFORM_BSD
#define WAPP_PLATFORM_POSIX #define WP_PLATFORM_POSIX
#elif defined(__OpenBSD__) #elif defined(__OpenBSD__)
#define WAPP_PLATFORM_OPEN_BSD #define WP_PLATFORM_OPEN_BSD
#define WAPP_PLATFORM_BSD #define WP_PLATFORM_BSD
#define WAPP_PLATFORM_POSIX #define WP_PLATFORM_POSIX
#elif defined(__DragonFly__) #elif defined(__DragonFly__)
#define WAPP_PLATFORM_DRAGON_FLY #define WP_PLATFORM_DRAGON_FLY
#define WAPP_PLATFORM_BSD #define WP_PLATFORM_BSD
#define WAPP_PLATFORM_POSIX #define WP_PLATFORM_POSIX
#elif defined(__bsdi__) #elif defined(__bsdi__)
#define WAPP_PLATFORM_BSD #define WP_PLATFORM_BSD
#define WAPP_PLATFORM_POSIX #define WP_PLATFORM_POSIX
#elif defined(__linux__) || defined(linux) || defined(__linux) || defined(__gnu_linux__) #elif defined(__linux__) || defined(linux) || defined(__linux) || defined(__gnu_linux__)
#define WAPP_PLATFORM_LINUX #define WP_PLATFORM_LINUX
#define WAPP_PLATFORM_POSIX #define WP_PLATFORM_POSIX
#elif defined(__GNU__) || defined(__gnu_hurd__) #elif defined(__GNU__) || defined(__gnu_hurd__)
#define WAPP_PLATFORM_GNU #define WP_PLATFORM_GNU
#define WAPP_PLATFORM_POSIX #define WP_PLATFORM_POSIX
#elif defined(__APPLE__) || defined(__MACH__) #elif defined(__APPLE__) || defined(__MACH__)
#include <TargetConditionals.h> #include <TargetConditionals.h>
#if TARGET_OS_IPHONE #if TARGET_OS_IPHONE
#define WAPP_PLATFORM_IOS #define WP_PLATFORM_IOS
#define WAPP_PLATFORM_APPLE #define WP_PLATFORM_APPLE
#define WAPP_PLATFORM_POSIX #define WP_PLATFORM_POSIX
#elif TARGET_OS_MAC #elif TARGET_OS_MAC
#define WAPP_PLATFORM_MACOS #define WP_PLATFORM_MACOS
#define WAPP_PLATFORM_APPLE #define WP_PLATFORM_APPLE
#define WAPP_PLATFORM_POSIX #define WP_PLATFORM_POSIX
#else #else
#error "Unrecognised Apple platform" #error "Unrecognised Apple platform"
#endif #endif
#elif defined(_WIN64) #elif defined(_WIN64)
#define WAPP_PLATFORM_WINDOWS64 #define WP_PLATFORM_WINDOWS64
#define WAPP_PLATFORM_WINDOWS #define WP_PLATFORM_WINDOWS
#elif defined(_WIN32) #elif defined(_WIN32)
#define WAPP_PLATFORM_WINDOWS32 #define WP_PLATFORM_WINDOWS32
#define WAPP_PLATFORM_WINDOWS #define WP_PLATFORM_WINDOWS
#elif defined(__CYGWIN__) #elif defined(__CYGWIN__)
#define WAPP_PLATFORM_CYGWIN #define WP_PLATFORM_CYGWIN
#define WAPP_PLATFORM_WINDOWS #define WP_PLATFORM_WINDOWS
#elif defined(__unix__) || defined(__unix) #elif defined(__unix__) || defined(__unix)
#define WAPP_PLATFORM_UNIX #define WP_PLATFORM_UNIX
#define WAPP_PLATFORM_POSIX #define WP_PLATFORM_POSIX
#else #else
#error "Unrecognised platform" #error "Unrecognised platform"
#endif #endif
#ifdef __cplusplus // Compiler
#define WAPP_PLATFORM_CPP #if defined(__clang__)
#define WAPP_PLATFORM_CPP_VERSION __cplusplus #define WP_PLATFORM_CLANG
#define WAPP_PLATFORM_CPP98_VERSION 199711L
#define WAPP_PLATFORM_CPP11_VERSION 201103L
#define WAPP_PLATFORM_CPP14_VERSION 201402L
#define WAPP_PLATFORM_CPP17_VERSION 201703L
#define WAPP_PLATFORM_CPP20_VERSION 202002L
#define WAPP_PLATFORM_CPP23_VERSION 202302L
#if WAPP_PLATFORM_CPP_VERSION == WAPP_PLATFORM_CPP98_VERSION #if defined(__GNUG__)
#define WAPP_PLATFORM_CPP98 #define WP_PLATFORM_CLANGPP
#elif WAPP_PLATFORM_CPP_VERSION == WAPP_PLATFORM_CPP11_VERSION #endif
#define WAPP_PLATFORM_CPP11
#elif WAPP_PLATFORM_CPP_VERSION == WAPP_PLATFORM_CPP14_VERSION #define WP_PLATFORM_CLANG_MAJOR __clang_major__
#define WAPP_PLATFORM_CPP14 #define WP_PLATFORM_CLANG_MINOR __clang_minor__
#elif WAPP_PLATFORM_CPP_VERSION == WAPP_PLATFORM_CPP17_VERSION #define WP_PLATFORM_CLANG_PATCH __clang_patchlevel__
#define WAPP_PLATFORM_CPP17 #elif defined(__GNUC__) || defined(__GNUG__)
#elif WAPP_PLATFORM_CPP_VERSION == WAPP_PLATFORM_CPP20_VERSION #define WP_PLATFORM_GCC
#define WAPP_PLATFORM_CPP20
#elif WAPP_PLATFORM_CPP_VERSION == WAPP_PLATFORM_CPP23_VERSION #if defined(__GNUG__)
#define WAPP_PLATFORM_CPP23 #define WP_PLATFORM_GPP
#endif
#define WP_PLATFORM_GCC_MAJOR __GNUC__
#define WP_PLATFORM_GCC_MINOR __GNUC_MINOR__
#if defined(__GNUC_PATCHLEVEL__)
#define WP_PLATFORM_GCC_PATCH __GNUC_PATCHLEVEL__
#endif
#elif defined(_MSC_VER)
#define WP_PLATFORM_MSVC
#define WP_PLATFORM_MSVC_FULL_VERSION _MSC_FULL_VER
#define WP_PLATFORM_MSVC_VERSION _MSC_VER
#else
#error "Unrecognised compiler"
#endif
// Language
#ifdef __cplusplus
#define WP_PLATFORM_CPP
#define WP_PLATFORM_CPP_VERSION __cplusplus
#define WP_PLATFORM_CPP98_VERSION 199711L
#define WP_PLATFORM_CPP11_VERSION 201103L
#define WP_PLATFORM_CPP14_VERSION 201402L
#define WP_PLATFORM_CPP17_VERSION 201703L
#define WP_PLATFORM_CPP20_VERSION 202002L
#define WP_PLATFORM_CPP23_VERSION 202302L
#if WP_PLATFORM_CPP_VERSION == WP_PLATFORM_CPP98_VERSION
#define WP_PLATFORM_CPP98
#elif WP_PLATFORM_CPP_VERSION == WP_PLATFORM_CPP11_VERSION
#define WP_PLATFORM_CPP11
#elif WP_PLATFORM_CPP_VERSION == WP_PLATFORM_CPP14_VERSION
#define WP_PLATFORM_CPP14
#elif WP_PLATFORM_CPP_VERSION == WP_PLATFORM_CPP17_VERSION
#define WP_PLATFORM_CPP17
#elif WP_PLATFORM_CPP_VERSION == WP_PLATFORM_CPP20_VERSION
#define WP_PLATFORM_CPP20
#elif WP_PLATFORM_CPP_VERSION == WP_PLATFORM_CPP23_VERSION
#define WP_PLATFORM_CPP23
#else #else
#error "Unrecognised C++ version" #error "Unrecognised C++ version"
#endif #endif
#else #else
#define WAPP_PLATFORM_C #define WP_PLATFORM_C
#if defined(__STDC_VERSION__) #if defined(__STDC_VERSION__)
#define WAPP_PLATFORM_C_VERSION __STDC_VERSION__ #define WP_PLATFORM_C_VERSION __STDC_VERSION__
#define WAPP_PLATFORM_C99_VERSION 199901L #define WP_PLATFORM_C99_VERSION 199901L
#define WAPP_PLATFORM_C11_VERSION 201112L #define WP_PLATFORM_C11_VERSION 201112L
#define WAPP_PLATFORM_C17_VERSION 201710L #define WP_PLATFORM_C17_VERSION 201710L
#define WAPP_PLATFORM_C23_VERSION 202311L #define WP_PLATFORM_C23_VERSION 202311L
#if WAPP_PLATFORM_C_VERSION == WAPP_PLATFORM_C99_VERSION #if WP_PLATFORM_C_VERSION == WP_PLATFORM_C99_VERSION
#define WAPP_PLATFORM_C99 #define WP_PLATFORM_C99
#elif WAPP_PLATFORM_C_VERSION == WAPP_PLATFORM_C11_VERSION #elif WP_PLATFORM_C_VERSION == WP_PLATFORM_C11_VERSION
#define WAPP_PLATFORM_C11 #define WP_PLATFORM_C11
#elif WAPP_PLATFORM_C_VERSION == WAPP_PLATFORM_C17_VERSION #elif WP_PLATFORM_C_VERSION == WP_PLATFORM_C17_VERSION
#define WAPP_PLATFORM_C17 #define WP_PLATFORM_C17
#elif WAPP_PLATFORM_C_VERSION == WAPP_PLATFORM_C23_VERSION #elif WP_PLATFORM_C_VERSION == WP_PLATFORM_C23_VERSION
#define WAPP_PLATFORM_C23 #define WP_PLATFORM_C23
#else #else
#error "Unrecognised C version" #error "Unrecognised C version"
#endif #endif
#else #else
#define WAPP_PLATFORM_C89 #define WP_PLATFORM_C89
#endif #endif
#endif // !__cplusplus #endif // !__cplusplus
+94 -56
View File
@@ -1,99 +1,137 @@
// vim:fileencoding=utf-8:foldmethod=marker // vim:fileencoding=utf-8:foldmethod=marker
#include "log.h" #include "log.h"
#include "../base/strings/str8/str8.h"
#include "../common/aliases/aliases.h" #include "../common/aliases/aliases.h"
#include "../common/assert/assert.h" #include "../common/assert/assert.h"
#include "../common/misc/misc_utils.h"
#include "../os/file/file.h" #include "../os/file/file.h"
#include <time.h>
#define LOG_LEVEL_STR_LENGTH 8 #define MIN_LOG_MSG_LENGTH 32
#define LOG_PREFIX_BUF_LENGTH 16 #define TIME_BUF_CAPACITY 70
typedef struct { wp_intern WpStr8RO L_BRACKET = wpStr8LitRo("[");
WFile *outlog; wp_intern WpStr8RO R_BRACKET_SPACE = wpStr8LitRo("] ");
WFile *errlog; wp_intern WpStr8RO R_BRACKET_NEWLINE = wpStr8LitRo("]\n");
LogLevel level;
typedef struct LogConfig {
WpFile *outlog;
WpFile *errlog;
WpLogLevel level;
wpMiscUtilsReservePadding(2 * sizeof(WpFile *) + sizeof(WpLogLevel));
} LogConfig; } LogConfig;
wapp_intern LogConfig LOG_CONFIG = { wp_intern LogConfig LOG_CONFIG = {
.level = WAPP_LOG_DEBUG, .level = WP_LOG_LEVEL_DEBUG,
}; };
wapp_intern Str8RO LOG_LEVEL_STRINGS[COUNT_LOG_LEVEL] = { wp_intern WpStr8RO LOG_LEVEL_STRINGS[COUNT_LOG_LEVEL] = {
[WAPP_LOG_FATAL] = wapp_str8_lit_ro_initialiser_list("[ FATAL ] "), [WP_LOG_LEVEL_FATAL] = wpStr8LitRoInitialiserList("fatal "),
[WAPP_LOG_CRITICAL] = wapp_str8_lit_ro_initialiser_list("[ CRITICAL ] "), [WP_LOG_LEVEL_CRITICAL] = wpStr8LitRoInitialiserList("critical "),
[WAPP_LOG_ERROR] = wapp_str8_lit_ro_initialiser_list("[ ERROR ] "), [WP_LOG_LEVEL_ERROR] = wpStr8LitRoInitialiserList("error "),
[WAPP_LOG_WARNING] = wapp_str8_lit_ro_initialiser_list("[ WARNING ] "), [WP_LOG_LEVEL_WARNING] = wpStr8LitRoInitialiserList("warning "),
[WAPP_LOG_INFO] = wapp_str8_lit_ro_initialiser_list("[ INFO ] "), [WP_LOG_LEVEL_INFO] = wpStr8LitRoInitialiserList("info "),
[WAPP_LOG_DEBUG] = wapp_str8_lit_ro_initialiser_list("[ DEBUG ] "), [WP_LOG_LEVEL_DEBUG] = wpStr8LitRoInitialiserList("debug "),
}; };
wapp_intern void _write_log_line(WFile *fp, const Logger *logger, Str8 msg, LogLevel level); wp_intern void getCurrentTimeString(WpStr8 *dst);
wp_intern void writeLogLine(WpFile *fp, const WpLogger *logger, WpStr8 msg, WpLogLevel level);
void wapp_log_set_level(LogLevel level) { void wpLogSetLevel(WpLogLevel level) {
LOG_CONFIG.level = level; LOG_CONFIG.level = level;
} }
void wapp_log_configure(WFile *outlog, WFile *errlog, LogLevel level) { void wpLogConfigure(WpFile *outlog, WpFile *errlog, WpLogLevel level) {
LOG_CONFIG.outlog = outlog; LOG_CONFIG.outlog = outlog;
LOG_CONFIG.errlog = errlog; LOG_CONFIG.errlog = errlog;
LOG_CONFIG.level = level; LOG_CONFIG.level = level;
} }
Logger wapp_log_make_logger(Str8 name) { WpLogger wpLogMakeLogger(WpStr8 name) {
return (Logger){ .name = name }; return (WpLogger){ .name = name };
} }
void wapp_log_debug(const Logger *logger, Str8 msg) { void wpLogDebug(const WpLogger *logger, WpStr8 msg) {
wapp_debug_assert(logger != NULL, "`logger` should not be NULL"); wpDebugAssert(logger != NULL, "`logger` should not be NULL");
if (LOG_CONFIG.level < WAPP_LOG_DEBUG) { return; } if (LOG_CONFIG.level < WP_LOG_LEVEL_DEBUG) { return; }
WFile *fp = LOG_CONFIG.outlog != NULL ? LOG_CONFIG.outlog : wapp_file_stdout(); WpFile *fp = LOG_CONFIG.outlog != NULL ? LOG_CONFIG.outlog : wpFileStdout();
_write_log_line(fp, logger, msg, WAPP_LOG_DEBUG); writeLogLine(fp, logger, msg, WP_LOG_LEVEL_DEBUG);
} }
void wapp_log_info(const Logger *logger, Str8 msg) { void wpLogInfo(const WpLogger *logger, WpStr8 msg) {
wapp_debug_assert(logger != NULL, "`logger` should not be NULL"); wpDebugAssert(logger != NULL, "`logger` should not be NULL");
if (LOG_CONFIG.level < WAPP_LOG_INFO) { return; } if (LOG_CONFIG.level < WP_LOG_LEVEL_INFO) { return; }
WFile *fp = LOG_CONFIG.outlog != NULL ? LOG_CONFIG.outlog : wapp_file_stdout(); WpFile *fp = LOG_CONFIG.outlog != NULL ? LOG_CONFIG.outlog : wpFileStdout();
_write_log_line(fp, logger, msg, WAPP_LOG_INFO); writeLogLine(fp, logger, msg, WP_LOG_LEVEL_INFO);
} }
void wapp_log_warning(const Logger *logger, Str8 msg) { void wpLogWarning(const WpLogger *logger, WpStr8 msg) {
wapp_debug_assert(logger != NULL, "`logger` should not be NULL"); wpDebugAssert(logger != NULL, "`logger` should not be NULL");
if (LOG_CONFIG.level < WAPP_LOG_WARNING) { return; } if (LOG_CONFIG.level < WP_LOG_LEVEL_WARNING) { return; }
WFile *fp = LOG_CONFIG.outlog != NULL ? LOG_CONFIG.outlog : wapp_file_stdout(); WpFile *fp = LOG_CONFIG.outlog != NULL ? LOG_CONFIG.outlog : wpFileStdout();
_write_log_line(fp, logger, msg, WAPP_LOG_WARNING); writeLogLine(fp, logger, msg, WP_LOG_LEVEL_WARNING);
} }
void wapp_log_error(const Logger *logger, Str8 msg) { void wpLogError(const WpLogger *logger, WpStr8 msg) {
wapp_debug_assert(logger != NULL, "`logger` should not be NULL"); wpDebugAssert(logger != NULL, "`logger` should not be NULL");
if (LOG_CONFIG.level < WAPP_LOG_ERROR) { return; } if (LOG_CONFIG.level < WP_LOG_LEVEL_ERROR) { return; }
WFile *fp = LOG_CONFIG.errlog != NULL ? LOG_CONFIG.errlog : wapp_file_stderr(); WpFile *fp = LOG_CONFIG.errlog != NULL ? LOG_CONFIG.errlog : wpFileStderr();
_write_log_line(fp, logger, msg, WAPP_LOG_ERROR); writeLogLine(fp, logger, msg, WP_LOG_LEVEL_ERROR);
} }
void wapp_log_critical(const Logger *logger, Str8 msg) { void wpLogCritical(const WpLogger *logger, WpStr8 msg) {
wapp_debug_assert(logger != NULL, "`logger` should not be NULL"); wpDebugAssert(logger != NULL, "`logger` should not be NULL");
if (LOG_CONFIG.level < WAPP_LOG_CRITICAL) { return; } if (LOG_CONFIG.level < WP_LOG_LEVEL_CRITICAL) { return; }
WFile *fp = LOG_CONFIG.errlog != NULL ? LOG_CONFIG.errlog : wapp_file_stderr(); WpFile *fp = LOG_CONFIG.errlog != NULL ? LOG_CONFIG.errlog : wpFileStderr();
_write_log_line(fp, logger, msg, WAPP_LOG_CRITICAL); writeLogLine(fp, logger, msg, WP_LOG_LEVEL_CRITICAL);
} }
void wapp_log_fatal(const Logger *logger, Str8 msg) { void wpLogFatal(const WpLogger *logger, WpStr8 msg) {
wapp_debug_assert(logger != NULL, "`logger` should not be NULL"); wpDebugAssert(logger != NULL, "`logger` should not be NULL");
if (LOG_CONFIG.level < WAPP_LOG_FATAL) { return; } if (LOG_CONFIG.level < WP_LOG_LEVEL_FATAL) { return; }
WFile *fp = LOG_CONFIG.errlog != NULL ? LOG_CONFIG.errlog : wapp_file_stderr(); WpFile *fp = LOG_CONFIG.errlog != NULL ? LOG_CONFIG.errlog : wpFileStderr();
_write_log_line(fp, logger, msg, WAPP_LOG_FATAL); writeLogLine(fp, logger, msg, WP_LOG_LEVEL_FATAL);
} }
wapp_intern void _write_log_line(WFile *fp, const Logger *logger, Str8 msg, LogLevel level) { wp_intern void getCurrentTimeString(WpStr8 *dst) {
wapp_file_write((void *)LOG_LEVEL_STRINGS[level].buf, fp, LOG_LEVEL_STRINGS[level].size); // TODO (Abdelrahman): Replace with proper date/time utilities
wapp_file_write((void *)logger->name.buf, fp, logger->name.size); char buf[TIME_BUF_CAPACITY];
wapp_file_write((void *)": ", fp, 2); time_t now = time(NULL);
wapp_file_write((void *)msg.buf, fp, msg.size); struct tm utc;
wapp_file_write((void *)"\n", fp, 1); gmtime_r(&now, &utc);
strftime(buf, sizeof(buf), "%FT%TZ ", &utc);
wpStr8CopyCstrCapped(dst, buf);
}
wp_intern void writeLogLine(WpFile *fp, const WpLogger *logger, WpStr8 msg, WpLogLevel level) {
WpStr8 padding = wpStr8Buf(MIN_LOG_MSG_LENGTH);
u32 padding_size = msg.size < MIN_LOG_MSG_LENGTH ? MIN_LOG_MSG_LENGTH - msg.size + 1 : 0;
wpStr8Format(&padding, "%-*s", padding_size, " ");
WpStr8 time_str = wpStr8Buf(TIME_BUF_CAPACITY);
getCurrentTimeString(&time_str);
WpStr8RO **strings = wpArray(
WpStr8RO *,
&time_str,
&L_BRACKET,
&LOG_LEVEL_STRINGS[level],
&R_BRACKET_SPACE,
&msg,
&padding,
&L_BRACKET,
&logger->name,
&R_BRACKET_NEWLINE
);
for (u64 i = 0; i < wpArrayCount(strings); ++i) {
wpFileWriteStr8(strings[i], fp);
}
} }
+28 -20
View File
@@ -6,29 +6,37 @@
#include "../os/file/file.h" #include "../os/file/file.h"
#include "../base/strings/str8/str8.h" #include "../base/strings/str8/str8.h"
typedef enum { #ifdef WP_PLATFORM_CPP
WAPP_LOG_FATAL, BEGIN_C_LINKAGE
WAPP_LOG_CRITICAL, #endif // !WP_PLATFORM_CPP
WAPP_LOG_ERROR,
WAPP_LOG_WARNING, typedef enum WpLogLevel {
WAPP_LOG_INFO, WP_LOG_LEVEL_FATAL,
WAPP_LOG_DEBUG, WP_LOG_LEVEL_CRITICAL,
WP_LOG_LEVEL_ERROR,
WP_LOG_LEVEL_WARNING,
WP_LOG_LEVEL_INFO,
WP_LOG_LEVEL_DEBUG,
COUNT_LOG_LEVEL, COUNT_LOG_LEVEL,
} LogLevel; } WpLogLevel;
typedef struct { typedef struct WpLogger {
Str8 name; WpStr8 name;
} Logger; } WpLogger;
void wapp_log_set_level(LogLevel level); void wpLogSetLevel(WpLogLevel level);
void wapp_log_configure(WFile *outlog, WFile *errlog, LogLevel level); void wpLogConfigure(WpFile *outlog, WpFile *errlog, WpLogLevel level);
Logger wapp_log_make_logger(Str8 name); WpLogger wpLogMakeLogger(WpStr8 name);
void wapp_log_debug(const Logger *logger, Str8 msg); void wpLogDebug(const WpLogger *logger, WpStr8 msg);
void wapp_log_info(const Logger *logger, Str8 msg); void wpLogInfo(const WpLogger *logger, WpStr8 msg);
void wapp_log_warning(const Logger *logger, Str8 msg); void wpLogWarning(const WpLogger *logger, WpStr8 msg);
void wapp_log_error(const Logger *logger, Str8 msg); void wpLogError(const WpLogger *logger, WpStr8 msg);
void wapp_log_critical(const Logger *logger, Str8 msg); void wpLogCritical(const WpLogger *logger, WpStr8 msg);
void wapp_log_fatal(const Logger *logger, Str8 msg); void wpLogFatal(const WpLogger *logger, WpStr8 msg);
#ifdef WP_PLATFORM_CPP
END_C_LINKAGE
#endif // !WP_PLATFORM_CPP
#endif // !LOG_H #endif // !LOG_H
+615
View File
@@ -0,0 +1,615 @@
// vim:fileencoding=utf-8:foldmethod=marker
//
// oldnames.h — backward-compatible #define mappings for renames in the
// wizapp-stdlib naming-conventions branch.
//
// Every public API symbol that was renamed is mapped from its old name to
// its new name so that existing code continues to compile without changes.
//
// Rename patterns applied across all modules:
// wapp_xxx() → wpXxx()
// WAPP_XXX → WP_XXX
// GenericXxx → WpXxx
// SHELL_XXX → WP_SHELL_XXX
// _xxx_yyy() → _xxxYyy()
//
// Sections: Constants → Types → Functions
#ifndef OLDNAMES_H
#define OLDNAMES_H
// ============================================================================
// ===== Constants =====
// ============================================================================
// --- Aliases ---
#define WAPP_PLATFORM_CPP WP_PLATFORM_CPP
#define WAPP_PLATFORM_C WP_PLATFORM_C
// --- Arena ---
#define WAPP_MEM_ALLOC_RESERVE WP_MEM_ALLOC_RESERVE
#define WAPP_MEM_ALLOC_COMMIT WP_MEM_ALLOC_COMMIT
// --- Array ---
#define WAPP_ARRAY_MAGIC WP_ARRAY_MAGIC
#define ARRAY_INIT_NONE WP_ARRAY_INIT_NONE
#define ARRAY_INIT_FILLED WP_ARRAY_INIT_FILLED
// --- Assert ---
#define WAPP_NO_RUNTIME_ASSERT WP_NO_RUNTIME_ASSERT
#define WAPP_DEBUG_ASSERT WP_DEBUG_ASSERT
// --- CPath ---
#define WAPP_PATH_SEP WP_PATH_SEP
#define WAPP_PATH_MAX WP_PATH_MAX
#define CPATH_JOIN_SUCCESS WP_CPATH_JOIN_RESULT_SUCCESS
#define CPATH_JOIN_INVALID_ARGS WP_CPATH_JOIN_RESULT_INVALID_ARGS
#define CPATH_JOIN_EMPTY_PARTS WP_CPATH_JOIN_RESULT_EMPTY_PARTS
#define CPATH_JOIN_INSUFFICIENT_DST_CAPACITY WP_CPATH_JOIN_RESULT_INSUFFICIENT_DST_CAPACITY
// --- DblList ---
#define WAPP_DBL_LIST_MAGIC WP_DBL_LIST_MAGIC
#define WAPP_DBL_NODE_MAGIC WP_DBL_NODE_MAGIC
// --- File ---
#define WAPP_ACCESS_READ WP_ACCESS_READ
#define WAPP_ACCESS_WRITE WP_ACCESS_WRITE
#define WAPP_ACCESS_APPEND WP_ACCESS_APPEND
#define WAPP_ACCESS_READ_EX WP_ACCESS_READ_EX
#define WAPP_ACCESS_WRITE_EX WP_ACCESS_WRITE_EX
#define WAPP_ACCESS_APPEND_EX WP_ACCESS_APPEND_EX
#define WAPP_ACCESS_WRITE_FAIL_ON_EXIST WP_ACCESS_WRITE_FAIL_ON_EXIST
#define WAPP_ACCESS_WRITE_FAIL_ON_EXIST_EX WP_ACCESS_WRITE_FAIL_ON_EXIST_EX
#define WAPP_SEEK_START WP_SEEK_START
#define WAPP_SEEK_CURRENT WP_SEEK_CURRENT
#define WAPP_SEEK_END WP_SEEK_END
#define END_OF_LINE WP_END_OF_LINE
// --- Log ---
#define WAPP_LOG_FATAL WP_LOG_LEVEL_FATAL
#define WAPP_LOG_CRITICAL WP_LOG_LEVEL_CRITICAL
#define WAPP_LOG_ERROR WP_LOG_LEVEL_ERROR
#define WAPP_LOG_WARNING WP_LOG_LEVEL_WARNING
#define WAPP_LOG_INFO WP_LOG_LEVEL_INFO
#define WAPP_LOG_DEBUG WP_LOG_LEVEL_DEBUG
// --- Mem Os ---
#define WAPP_MEM_ACCESS_NONE WP_MEM_ACCESS_NONE
#define WAPP_MEM_ACCESS_READ_ONLY WP_MEM_ACCESS_READ_ONLY
#define WAPP_MEM_ACCESS_EXEC_ONLY WP_MEM_ACCESS_EXEC_ONLY
#define WAPP_MEM_ACCESS_READ_WRITE WP_MEM_ACCESS_READ_WRITE
#define WAPP_MEM_ACCESS_READ_EXEC WP_MEM_ACCESS_READ_EXEC
#define WAPP_MEM_ACCESS_READ_WRITE_EXEC WP_MEM_ACCESS_READ_WRITE_EXEC
#define WAPP_MEM_INIT_UNINITIALISED WP_MEM_INIT_UNINITIALISED
#define WAPP_MEM_INIT_INITIALISED WP_MEM_INIT_INITIALISED
// --- Platform ---
#define WAPP_PLATFORM_ANDROID WP_PLATFORM_ANDROID
#define WAPP_PLATFORM_FREE_BSD WP_PLATFORM_FREE_BSD
#define WAPP_PLATFORM_NET_BSD WP_PLATFORM_NET_BSD
#define WAPP_PLATFORM_OPEN_BSD WP_PLATFORM_OPEN_BSD
#define WAPP_PLATFORM_DRAGON_FLY WP_PLATFORM_DRAGON_FLY
#define WAPP_PLATFORM_BSD WP_PLATFORM_BSD
#define WAPP_PLATFORM_POSIX WP_PLATFORM_POSIX
#define WAPP_PLATFORM_LINUX WP_PLATFORM_LINUX
#define WAPP_PLATFORM_GNU WP_PLATFORM_GNU
#define WAPP_PLATFORM_IOS WP_PLATFORM_IOS
#define WAPP_PLATFORM_APPLE WP_PLATFORM_APPLE
#define WAPP_PLATFORM_MACOS WP_PLATFORM_MACOS
#define WAPP_PLATFORM_WINDOWS64 WP_PLATFORM_WINDOWS64
#define WAPP_PLATFORM_WINDOWS32 WP_PLATFORM_WINDOWS32
#define WAPP_PLATFORM_WINDOWS WP_PLATFORM_WINDOWS
#define WAPP_PLATFORM_CYGWIN WP_PLATFORM_CYGWIN
#define WAPP_PLATFORM_UNIX WP_PLATFORM_UNIX
#define WAPP_PLATFORM_CPP_VERSION WP_PLATFORM_CPP_VERSION
#define WAPP_PLATFORM_CPP98_VERSION WP_PLATFORM_CPP98_VERSION
#define WAPP_PLATFORM_CPP11_VERSION WP_PLATFORM_CPP11_VERSION
#define WAPP_PLATFORM_CPP14_VERSION WP_PLATFORM_CPP14_VERSION
#define WAPP_PLATFORM_CPP17_VERSION WP_PLATFORM_CPP17_VERSION
#define WAPP_PLATFORM_CPP20_VERSION WP_PLATFORM_CPP20_VERSION
#define WAPP_PLATFORM_CPP23_VERSION WP_PLATFORM_CPP23_VERSION
#define WAPP_PLATFORM_CPP98 WP_PLATFORM_CPP98
#define WAPP_PLATFORM_CPP11 WP_PLATFORM_CPP11
#define WAPP_PLATFORM_CPP14 WP_PLATFORM_CPP14
#define WAPP_PLATFORM_CPP17 WP_PLATFORM_CPP17
#define WAPP_PLATFORM_CPP20 WP_PLATFORM_CPP20
#define WAPP_PLATFORM_CPP23 WP_PLATFORM_CPP23
#define WAPP_PLATFORM_C_VERSION WP_PLATFORM_C_VERSION
#define WAPP_PLATFORM_C99_VERSION WP_PLATFORM_C99_VERSION
#define WAPP_PLATFORM_C11_VERSION WP_PLATFORM_C11_VERSION
#define WAPP_PLATFORM_C17_VERSION WP_PLATFORM_C17_VERSION
#define WAPP_PLATFORM_C23_VERSION WP_PLATFORM_C23_VERSION
#define WAPP_PLATFORM_C99 WP_PLATFORM_C99
#define WAPP_PLATFORM_C11 WP_PLATFORM_C11
#define WAPP_PLATFORM_C17 WP_PLATFORM_C17
#define WAPP_PLATFORM_C23 WP_PLATFORM_C23
#define WAPP_PLATFORM_C89 WP_PLATFORM_C89
// --- Shell Commander ---
#define SHELL_OUTPUT_DISCARD WP_SHELL_OUTPUT_DISCARD
#define SHELL_OUTPUT_PRINT WP_SHELL_OUTPUT_PRINT
#define SHELL_OUTPUT_CAPTURE WP_SHELL_OUTPUT_CAPTURE
#define SHELL_ERR_NO_ERROR WP_SHELL_ERR_NO_ERROR
#define SHELL_ERR_INVALID_ARGS WP_SHELL_ERR_INVALID_ARGS
#define SHELL_ERR_ALLOCATION_FAIL WP_SHELL_ERR_ALLOCATION_FAIL
#define SHELL_ERR_PROC_START_FAIL WP_SHELL_ERR_PROC_START_FAIL
#define SHELL_ERR_OUT_BUF_FULL WP_SHELL_ERR_OUT_BUF_FULL
#define SHELL_ERR_PROC_EXIT_FAIL WP_SHELL_ERR_PROC_EXIT_FAIL
// --- Shell Termcolour ---
#define WAPP_TERM_COLOUR_FG_BLACK WP_TERM_COLOUR_FG_BLACK
#define WAPP_TERM_COLOUR_FG_RED WP_TERM_COLOUR_FG_RED
#define WAPP_TERM_COLOUR_FG_GREEN WP_TERM_COLOUR_FG_GREEN
#define WAPP_TERM_COLOUR_FG_BLUE WP_TERM_COLOUR_FG_BLUE
#define WAPP_TERM_COLOUR_FG_CYAN WP_TERM_COLOUR_FG_CYAN
#define WAPP_TERM_COLOUR_FG_MAGENTA WP_TERM_COLOUR_FG_MAGENTA
#define WAPP_TERM_COLOUR_FG_YELLOW WP_TERM_COLOUR_FG_YELLOW
#define WAPP_TERM_COLOUR_FG_WHITE WP_TERM_COLOUR_FG_WHITE
#define WAPP_TERM_COLOUR_FG_BR_BLACK WP_TERM_COLOUR_FG_BR_BLACK
#define WAPP_TERM_COLOUR_FG_BR_RED WP_TERM_COLOUR_FG_BR_RED
#define WAPP_TERM_COLOUR_FG_BR_GREEN WP_TERM_COLOUR_FG_BR_GREEN
#define WAPP_TERM_COLOUR_FG_BR_BLUE WP_TERM_COLOUR_FG_BR_BLUE
#define WAPP_TERM_COLOUR_FG_BR_CYAN WP_TERM_COLOUR_FG_BR_CYAN
#define WAPP_TERM_COLOUR_FG_BR_MAGENTA WP_TERM_COLOUR_FG_BR_MAGENTA
#define WAPP_TERM_COLOUR_FG_BR_YELLOW WP_TERM_COLOUR_FG_BR_YELLOW
#define WAPP_TERM_COLOUR_FG_BR_WHITE WP_TERM_COLOUR_FG_BR_WHITE
#define WAPP_TERM_COLOUR_CLEAR WP_TERM_COLOUR_CLEAR
// --- Str8 ---
#define WAPP_STR8_SPEC WP_STR8_SPEC
// --- UUID ---
#define UUID_BUF_LENGTH WP_UUID_BUF_LENGTH
#define WAPP_UUID_SPEC WP_UUID_SPEC
// ============================================================================
// ===== Types =====
// ============================================================================
// --- Aliases ---
#define wapp_extern wp_extern
#define wapp_intern wp_intern
#define wapp_persist wp_persist
#define wapp_class_mem wp_class_mem
// --- Arena ---
#define Arena WpArena
// --- Array ---
#define GenericArray WpArray
#define VoidPtrArray WpVoidPtrArray
#define C8Array WpC8Array
#define C16Array WpC16Array
#define C32Array WpC32Array
#define U8Array WpU8Array
#define U16Array WpU16Array
#define U32Array WpU32Array
#define U64Array WpU64Array
#define B8Array WpB8Array
#define I8Array WpI8Array
#define I16Array WpI16Array
#define I32Array WpI32Array
#define I64Array WpI64Array
#define F32Array WpF32Array
#define F64Array WpF64Array
#define F128Array WpF128Array
#define UptrArray WpUptrArray
#define IptrArray WpIptrArray
#define Str8Array WpStr8Array
#define ArrayHeader WpArrayHeader
#define ArrayInitFlags WpArrayInitFlags
// --- DblList ---
#define GenericNode WpDblNode
#define NodeHeader WpDblNodeHeader
#define GenericList WpDblList
#define VoidPtrList WpVoidPtrList
#define C8List WpC8List
#define C16List WpC16List
#define C32List WpC32List
#define U8List WpU8List
#define U16List WpU16List
#define U32List WpU32List
#define U64List WpU64List
#define B8List WpB8List
#define I8List WpI8List
#define I16List WpI16List
#define I32List WpI32List
#define I64List WpI64List
#define F32List WpF32List
#define F64List WpF64List
#define F128List WpF128List
#define UptrList WpUptrList
#define IptrList WpIptrList
#define Str8List WpStr8List
#define VoidPtrNode WpVoidPtrNode
#define C8Node WpC8Node
#define C16Node WpC16Node
#define C32Node WpC32Node
#define U8Node WpU8Node
#define U16Node WpU16Node
#define U32Node WpU32Node
#define U64Node WpU64Node
#define B8Node WpB8Node
#define I8Node WpI8Node
#define I16Node WpI16Node
#define I32Node WpI32Node
#define I64Node WpI64Node
#define F32Node WpF32Node
#define F64Node WpF64Node
#define F128Node WpF128Node
#define UptrNode WpUptrNode
#define IptrNode WpIptrNode
#define Str8Node WpStr8Node
// --- File ---
#define WFile WpFile
#define FileAccessMode WpFileAccessMode
#define FileSeekOrigin WpFileSeekOrigin
// --- Log ---
#define LogLevel WpLogLevel
#define Logger WpLogger
// --- Mem Allocator ---
#define Allocator WpAllocator
#define MemAllocFunc WpMemAllocFunc
#define MemAllocAlignedFunc WpMemAllocAlignedFunc
#define MemReallocFunc WpMemReallocFunc
#define MemReallocAlignedFunc WpMemReallocAlignedFunc
#define MemFreeFunc WpMemFreeFunc
// --- Mem Os ---
#define MemAccess WpMemAccess
#define MemInitType WpMemInitType
#define MemAllocFlags WpMemAllocFlags
// --- PRNG Xorshift ---
#define XOR256State WpXor256State
// --- Queue ---
#define GenericQueue WpQueue
#define VoidPtrQueue WpVoidPtrQueue
#define C8Queue WpC8Queue
#define C16Queue WpC16Queue
#define C32Queue WpC32Queue
#define U8Queue WpU8Queue
#define U16Queue WpU16Queue
#define U32Queue WpU32Queue
#define U64Queue WpU64Queue
#define B8Queue WpB8Queue
#define I8Queue WpI8Queue
#define I16Queue WpI16Queue
#define I32Queue WpI32Queue
#define I64Queue WpI64Queue
#define F32Queue WpF32Queue
#define F64Queue WpF64Queue
#define F128Queue WpF128Queue
#define UptrQueue WpUptrQueue
#define IptrQueue WpIptrQueue
#define Str8Queue WpStr8Queue
// --- Shell Commander ---
#define CMDResult WpCmdResult
#define CMDOutHandling WpCmdOutHandling
#define CMDError WpCmdError
// --- Shell Termcolour ---
#define TerminalColour WpTerminalColour
// --- Str8 ---
#define Str8 WpStr8
#define Str8RO WpStr8RO
// --- Tester ---
#define TestFuncResult WpTestFuncResult
#define TestFunc WpTestFunc
// --- UUID ---
#define WUUID WpUuid
// ============================================================================
// ===== Functions =====
// ============================================================================
// --- Arena ---
#define wapp_mem_arena_init_allocated wpMemArenaInitAllocated
#define wapp_mem_arena_init_allocated_commit wpMemArenaInitAllocatedCommit
#define wapp_mem_arena_init_allocated_zero wpMemArenaInitAllocatedZero
#define wapp_mem_arena_init_allocated_commit_and_zero wpMemArenaInitAllocatedCommitAndZero
#define wapp_mem_arena_init_allocated_custom wpMemArenaInitAllocatedCustom
#define wapp_mem_arena_init_buffer wpMemArenaInitBuffer
#define wapp_mem_arena_alloc wpMemArenaAlloc
#define wapp_mem_arena_alloc_aligned wpMemArenaAllocAligned
#define wapp_mem_arena_realloc wpMemArenaRealloc
#define wapp_mem_arena_realloc_aligned wpMemArenaReallocAligned
#define wapp_mem_arena_temp_begin wpMemArenaTempBegin
#define wapp_mem_arena_temp_end wpMemArenaTempEnd
#define wapp_mem_arena_clear wpMemArenaClear
#define wapp_mem_arena_destroy wpMemArenaDestroy
#define wapp_mem_arena_allocator_init wpMemArenaAllocatorInit
#define wapp_mem_arena_allocator_init_commit wpMemArenaAllocatorInitCommit
#define wapp_mem_arena_allocator_init_zero wpMemArenaAllocatorInitZero
#define wapp_mem_arena_allocator_init_commit_and_zero wpMemArenaAllocatorInitCommitAndZero
#define wapp_mem_arena_allocator_init_custom wpMemArenaAllocatorInitCustom
#define wapp_mem_arena_allocator_init_with_buffer wpMemArenaAllocatorInitWithBuffer
#define wapp_mem_arena_allocator_temp_begin wpMemArenaAllocatorTempBegin
#define wapp_mem_arena_allocator_temp_end wpMemArenaAllocatorTempEnd
#define wapp_mem_arena_allocator_clear wpMemArenaAllocatorClear
#define wapp_mem_arena_allocator_destroy wpMemArenaAllocatorDestroy
// --- Array ---
#define wapp_array wpArray
#define wapp_array_with_capacity wpArrayWithCapacity
#define wapp_array_pop wpArrayPop
#define wapp_array_count wpArrayCount
#define wapp_array_capacity wpArrayCapacity
#define wapp_array_item_size wpArrayItemSize
#define wapp_array_set_count wpArraySetCount
#define wapp_array_get wpArrayGet
#define wapp_array_set wpArraySet
#define wapp_array_append_capped wpArrayAppendCapped
#define wapp_array_extend_capped wpArrayExtendCapped
#define wapp_array_copy_capped wpArrayCopyCapped
#define wapp_array_append_alloc wpArrayAppendAlloc
#define wapp_array_extend_alloc wpArrayExtendAlloc
#define wapp_array_copy_alloc wpArrayCopyAlloc
#define wapp_array_clear wpArrayClear
#define wapp_array_calc_alloc_size wpArrayCalcAllocSize
#define wapp_array_alloc_capacity wpArrayAllocCapacity
#define wapp_array_from_preallcated_buffer wpArrayFromPreallcatedBuffer
#define _array_count arrayCount
#define _array_capacity arrayCapacity
#define _array_item_size arrayItemSize
#define _array_set_count arraySetCount
#define _array_get arrayGet
#define _array_set arraySet
#define _array_append_capped arrayAppendCapped
#define _array_extend_capped arrayExtendCappend
#define _array_copy_capped arrayCopyCapped
#define _array_append_alloc arrayAppendAlloc
#define _array_extend_alloc arrayExtendAlloc
#define _array_copy_alloc arrayCopyAlloc
#define _array_pop arrayPop
#define _array_clear arrayClear
#define _array_calc_alloc_size arrayCalcAllocSize
#define _array_alloc_capacity arrayAllocCapacity
#define _array_from_preallocated_buffer arrayFromPreallocatedBuffer
// --- Assert ---
#define wapp_static_assert wpStaticAssert
#define wapp_runtime_assert wpRuntimeAssert
#define wapp_debug_assert wpDebugAssert
// --- CPath ---
#define wapp_cpath_dirname wpCpathDirname
#define wapp_cpath_dirup wpCpathDirup
#define wapp_cpath_join_path wpCpathJoinPath
#define dirup dirUp
// --- DblList ---
#define wapp_dbl_list wpDblList
#define wapp_dbl_list_alloc wpDblListAlloc
#define wapp_dbl_list_get wpDblListGet
#define wapp_dbl_list_get_node wpDblListGetNode
#define wapp_dbl_list_get_node_item wpDblListGetNodeItem
#define wapp_dbl_list_push_front wpDblListPushFront
#define wapp_dbl_list_push_back wpDblListPushBack
#define wapp_dbl_list_insert wpDblListInsert
#define wapp_dbl_list_push_front_alloc wpDblListPushFrontAlloc
#define wapp_dbl_list_push_back_alloc wpDblListPushBackAlloc
#define wapp_dbl_list_insert_alloc wpDblListInsertAlloc
#define wapp_dbl_list_pop_front wpDblListPopFront
#define wapp_dbl_list_pop_back wpDblListPopBack
#define wapp_dbl_list_remove wpDblListRemove
#define wapp_dbl_list_pop_front_node wpDblListPopFrontNode
#define wapp_dbl_list_pop_back_node wpDblListPopBackNode
#define wapp_dbl_list_remove_node wpDblListRemoveNode
#define wapp_dbl_list_empty wpDblListEmpty
#define _dbl_list_alloc dblListAlloc
#define _dbl_list_node_alloc dblListNodeAlloc
#define _dbl_list_get dblListGet
#define _dbl_list_push_front dblListPushFront
#define _dbl_list_push_back dblListPushBack
#define _dbl_list_insert dblListInsert
#define _dbl_list_pop_front dblListPopFront
#define _dbl_list_pop_back dblListPopBack
#define _dbl_list_remove dblListRemove
#define _dbl_list_empty dblListEmpty
// --- File ---
#define wapp_file_stdin wpFileStdin
#define wapp_file_stdout wpFileStdout
#define wapp_file_stderr wpFileStderr
#define wapp_file_open wpFileOpen
#define wapp_file_get_current_position wpFileGetCurrentPosition
#define wapp_file_seek wpFileSeek
#define wapp_file_get_length wpFileGetLength
#define wapp_file_read wpFileRead
#define wapp_file_write wpFileWrite
#define wapp_file_read_str8 wpFileReadStr8
#define wapp_file_write_str8 wpFileWriteStr8
#define wapp_file_read_array wpFileReadArray
#define wapp_file_write_array wpFileWriteArray
#define wapp_file_flush wpFileFlush
#define wapp_file_close wpFileClose
#define wapp_file_rename wpFileRename
#define wapp_file_remove wpFileRemove
#define _file_open fileOpen
#define _file_seek fileSeek
#define _file_read fileRead
#define _file_write fileWrite
#define _file_flush fileFlush
#define _file_close fileClose
#define _file_rename fileRename
#define _file_remove fileRemove
// --- Log ---
#define wapp_log_set_level wpLogSetLevel
#define wapp_log_configure wpLogConfigure
#define wapp_log_make_logger wpLogMakeLogger
#define wapp_log_debug wpLogDebug
#define wapp_log_info wpLogInfo
#define wapp_log_warning wpLogWarning
#define wapp_log_error wpLogError
#define wapp_log_critical wpLogCritical
#define wapp_log_fatal wpLogFatal
// --- Mem Allocator ---
#define wapp_mem_allocator_invalid wpMemAllocatorInvalid
#define wapp_mem_allocator_alloc wpMemAllocatorAlloc
#define wapp_mem_allocator_alloc_aligned wpMemAllocatorAllocAligned
#define wapp_mem_allocator_realloc wpMemAllocatorRealloc
#define wapp_mem_allocator_realloc_aligned wpMemAllocatorReallocAligned
#define wapp_mem_allocator_free wpMemAllocatorFree
// --- Mem Os ---
#define wapp_os_mem_alloc wpOsMemAlloc
#define wapp_os_mem_free wpOsMemFree
#define os_mem_allocate osMemAllocate
#define os_mem_free osMemFree
// --- Mem Utils ---
#define wapp_mem_util_align_forward wpMemUtilAlignForward
// --- Misc Utils ---
#define wapp_misc_utils_reserve_padding wpMiscUtilsReservePadding
#define wapp_misc_utils_u64_round_up_pow2 wpMiscUtilsU64RoundUpPow2
#define wapp_is_power_of_two wpMiscUtilsIsPowerOfTwo
#define wapp_pointer_offset wpMiscUtilsOffsetPointer
#define wapp_misc_utils_va_args_count wpMiscUtilsVaArgsCount
// --- PRNG Xorshift ---
#define wapp_prng_xorshift_init_state wpPrngXorshiftInit
#define wapp_prng_xorshift_256 wpPrngXorshift256
#define wapp_prng_xorshift_256ss wpPrngXorshift256ss
#define wapp_prng_xorshift_256p wpPrngXorshift256p
// --- Queue ---
#define wapp_queue wpQueue
#define wapp_queue_alloc wpQueueAlloc
#define wapp_queue_capacity wpQueueCapacity
#define wapp_queue_item_size wpQueueItemSize
#define wapp_queue_push wpQueuePush
#define wapp_queue_push_alloc wpQueuePushAlloc
#define wapp_queue_pop wpQueuePop
#define _queue_push queuePush
#define _queue_push_alloc queuePushAlloc
#define _queue_pop queuePop
// --- Shell Commander ---
#define CMD_NO_EXIT wpCmdNoExit
#define wapp_shell_commander_execute wpShellCommanderExecute
#define get_output_status getOutputStatus
// --- Shell Termcolour ---
#define wapp_shell_termcolour_print_text wpShellTermcolourPrintText
#define wapp_shell_termcolour_clear_colour wpShellTermcolourClearColour
#define print_coloured_text printColouredText
// --- Shell Utils ---
#define wapp_shell_utils_popen wpShellUtilsPopen
#define wapp_shell_utils_pclose wpShellUtilsPclose
// --- Str8 ---
#define wapp_str8_varg wpStr8Varg
#define wapp_str8_buf wpStr8Buf
#define wapp_str8_lit wpStr8Lit
#define wapp_str8_lit_ro wpStr8LitRo
#define wapp_str8_lit_ro_initialiser_list wpStr8LitRoInitialiserList
#define wapp_str8_alloc_buf wpStr8AllocBuf
#define wapp_str8_alloc_and_fill_buf wpStr8AllocAndFillBuf
#define wapp_str8_alloc_cstr wpStr8AllocCstr
#define wapp_str8_alloc_str8 wpStr8AllocStr8
#define wapp_str8_alloc_substr wpStr8AllocSubstr
#define wapp_str8_alloc_concat wpStr8AllocConcat
#define wapp_str8_dealloc_buf wpStr8DeallocBuf
#define wapp_str8_get wpStr8Get
#define wapp_str8_set wpStr8Set
#define wapp_str8_push_back wpStr8PushBack
#define wapp_str8_equal wpStr8Equal
#define wapp_str8_equal_to_count wpStr8EqualToCount
#define wapp_str8_slice wpStr8Slice
#define wapp_str8_concat_capped wpStr8ConcatCapped
#define wapp_str8_copy_cstr_capped wpStr8CopyCstrCapped
#define wapp_str8_copy_str8_capped wpStr8CopyStr8Capped
#define wapp_str8_copy_to_cstr wpStr8CopyToCstr
#define wapp_str8_format wpStr8Format
#define wapp_str8_to_lower wpStr8ToLower
#define wapp_str8_to_upper wpStr8ToUpper
#define wapp_str8_from_bytes wpStr8FromBytes
#define wapp_str8_find wpStr8Find
#define wapp_str8_rfind wpStr8Rfind
#define wapp_str8_split wpStr8Split
#define wapp_str8_rsplit wpStr8Rsplit
#define wapp_str8_split_with_max wpStr8SplitWithMax
#define wapp_str8_rsplit_with_max wpStr8RsplitWithMax
#define wapp_str8_join wpStr8Join
#define wapp_str8_list_total_size wpStr8ListTotalSize
// --- Tester ---
#define wapp_tester_result wpTesterResult
#define wapp_tester_run wpTesterRun
#define run_tests runTests
// --- UUID ---
#define wapp_uuid_varg wpUuidVarg
#define wapp_uuid_gen_uuid4 wpUuidGenUuid4
#define wapp_uuid_create wpUuidCreate
#define wapp_uuid_init_uuid4 wpUuidInitUuid4
#endif // !OLDNAMES_H
+47 -47
View File
@@ -16,12 +16,12 @@
#define ARENA_MINIMUM_CAPACITY KiB(16) // Allocate minimum of 4 pages #define ARENA_MINIMUM_CAPACITY KiB(16) // Allocate minimum of 4 pages
typedef enum { typedef enum ArenaStorageType {
ARENA_STORAGE_TYPE_ALLOCATED, ARENA_STORAGE_TYPE_ALLOCATED,
ARENA_STORAGE_TYPE_BUFFER, ARENA_STORAGE_TYPE_BUFFER,
} ArenaStorageType; } ArenaStorageType;
struct Arena { struct WpArena {
u8 *buf; u8 *buf;
u8 *offset; u8 *offset;
u8 *prev_offset; u8 *prev_offset;
@@ -29,99 +29,99 @@ struct Arena {
ArenaStorageType type; ArenaStorageType type;
b8 committed; b8 committed;
wapp_misc_utils_reserve_padding(sizeof(u8 *) * 3 + sizeof(u64) + sizeof(ArenaStorageType) + sizeof(b8)); wpMiscUtilsReservePadding(sizeof(u8 *) * 3 + sizeof(u64) + sizeof(ArenaStorageType) + sizeof(b8));
}; };
b8 wapp_mem_arena_init_buffer(Arena **arena, u8 *buffer, u64 buffer_size) { b8 wpMemArenaInitBuffer(WpArena **arena, u8 *buffer, u64 buffer_size) {
if (!arena || *arena || buffer_size < sizeof(Arena)) { if (!arena || *arena || buffer_size < sizeof(WpArena)) {
return false; return false;
} }
*arena = (Arena *)buffer; *arena = (WpArena *)buffer;
Arena *arena_ptr = *arena; WpArena *arena_ptr = *arena;
arena_ptr->buf = (u8 *)(arena_ptr + 1); arena_ptr->buf = (u8 *)(arena_ptr + 1);
arena_ptr->offset = arena_ptr->buf; arena_ptr->offset = arena_ptr->buf;
arena_ptr->prev_offset = NULL; arena_ptr->prev_offset = NULL;
arena_ptr->capacity = buffer_size - sizeof(Arena); arena_ptr->capacity = buffer_size - sizeof(WpArena);
arena_ptr->type = ARENA_STORAGE_TYPE_BUFFER; arena_ptr->type = ARENA_STORAGE_TYPE_BUFFER;
arena_ptr->committed = true; arena_ptr->committed = true;
return true; return true;
} }
b8 wapp_mem_arena_init_allocated_custom(Arena **arena, u64 base_capacity, MemAllocFlags flags, b8 zero_buffer) { b8 wpMemArenaInitAllocatedCustom(WpArena **arena, u64 base_capacity, WpMemAllocFlags flags, b8 zero_buffer) {
if (!arena || *arena || base_capacity == 0) { if (!arena || *arena || base_capacity == 0) {
return false; return false;
} }
u64 size = sizeof(Arena) + (base_capacity >= ARENA_MINIMUM_CAPACITY ? base_capacity : ARENA_MINIMUM_CAPACITY); u64 size = sizeof(WpArena) + (base_capacity >= ARENA_MINIMUM_CAPACITY ? base_capacity : ARENA_MINIMUM_CAPACITY);
u64 alloc_size = wapp_misc_utils_u64_round_up_pow2(size); u64 alloc_size = wpMiscUtilsU64RoundUpPow2(size);
u8 *allocated = (u8 *)wapp_os_mem_alloc(NULL, alloc_size, WAPP_MEM_ACCESS_READ_WRITE, flags, u8 *allocated = (u8 *)wpOsMemAlloc(NULL, alloc_size, WP_MEM_ACCESS_READ_WRITE, flags,
zero_buffer ? WAPP_MEM_INIT_INITIALISED : WAPP_MEM_INIT_UNINITIALISED); zero_buffer ? WP_MEM_INIT_INITIALISED : WP_MEM_INIT_UNINITIALISED);
if (!allocated) { if (!allocated) {
return false; return false;
} }
b8 committed = (flags & WAPP_MEM_ALLOC_COMMIT) == WAPP_MEM_ALLOC_COMMIT; b8 committed = (flags & WP_MEM_ALLOC_COMMIT) == WP_MEM_ALLOC_COMMIT;
#ifdef WAPP_PLATFORM_WINDOWS #ifdef WP_PLATFORM_WINDOWS
if (!committed) { if (!committed) {
wapp_os_mem_alloc(allocated, sizeof(Arena), WAPP_MEM_ACCESS_READ_WRITE, WAPP_MEM_ALLOC_COMMIT, wpOsMemAlloc(allocated, sizeof(WpArena), WP_MEM_ACCESS_READ_WRITE, WP_MEM_ALLOC_COMMIT,
WAPP_MEM_INIT_INITIALISED); WP_MEM_INIT_INITIALISED);
} }
#endif // ifdef WAPP_PLATFORM_WINDOWS #endif // ifdef WP_PLATFORM_WINDOWS
if (!wapp_mem_arena_init_buffer(arena, allocated, alloc_size)) { if (!wpMemArenaInitBuffer(arena, allocated, alloc_size)) {
wapp_mem_arena_destroy(arena); wpMemArenaDestroy(arena);
return false; return false;
} }
Arena *arena_ptr = *arena; WpArena *arena_ptr = *arena;
arena_ptr->type = ARENA_STORAGE_TYPE_ALLOCATED; arena_ptr->type = ARENA_STORAGE_TYPE_ALLOCATED;
arena_ptr->committed = committed; arena_ptr->committed = committed;
return true; return true;
} }
void *wapp_mem_arena_alloc(Arena *arena, u64 size) { void *wpMemArenaAlloc(WpArena *arena, u64 size) {
return wapp_mem_arena_alloc_aligned(arena, size, DEFAULT_ALIGNMENT); return wpMemArenaAllocAligned(arena, size, DEFAULT_ALIGNMENT);
} }
void *wapp_mem_arena_alloc_aligned(Arena *arena, u64 size, u64 alignment) { void *wpMemArenaAllocAligned(WpArena *arena, u64 size, u64 alignment) {
wapp_debug_assert(arena != NULL, "`arena` should not be NULL"); wpDebugAssert(arena != NULL, "`arena` should not be NULL");
u8 *alloc_start = arena->offset; u8 *alloc_start = arena->offset;
u8 *output = wapp_mem_util_align_forward((void *)alloc_start, alignment); u8 *output = wpMemUtilAlignForward((void *)alloc_start, alignment);
if (output + size >= arena->buf + arena->capacity) { if (output + size >= arena->buf + arena->capacity) {
return NULL; return NULL;
} }
arena->offset = output + size; arena->offset = output + size;
#ifdef WAPP_PLATFORM_WINDOWS #ifdef WP_PLATFORM_WINDOWS
if (arena->type == ARENA_STORAGE_TYPE_ALLOCATED && !(arena->committed)) { if (arena->type == ARENA_STORAGE_TYPE_ALLOCATED && !(arena->committed)) {
wapp_os_mem_alloc(alloc_start, (uptr)(arena->offset) - (uptr)(alloc_start), wpOsMemAlloc(alloc_start, (uptr)(arena->offset) - (uptr)(alloc_start),
WAPP_MEM_ACCESS_READ_WRITE, WAPP_MEM_ALLOC_COMMIT, WP_MEM_ACCESS_READ_WRITE, WP_MEM_ALLOC_COMMIT,
WAPP_MEM_INIT_UNINITIALISED); WP_MEM_INIT_UNINITIALISED);
} }
#endif // ifdef WAPP_PLATFORM_WINDOWS #endif // ifdef WP_PLATFORM_WINDOWS
memset(output, 0, size); memset(output, 0, size);
return (void *)output; return (void *)output;
} }
void *wapp_mem_arena_realloc(Arena *arena, void *ptr, u64 old_size, u64 new_size) { void *wpMemArenaRealloc(WpArena *arena, void *ptr, u64 old_size, u64 new_size) {
wapp_debug_assert(arena != NULL, "`arena` should not be NULL"); wpDebugAssert(arena != NULL, "`arena` should not be NULL");
if ((u8*)ptr < arena->buf || (u8*)ptr > arena->offset || if ((u8*)ptr < arena->buf || (u8*)ptr > arena->offset ||
arena->offset + new_size >= arena->buf + arena->capacity) { arena->offset + new_size >= arena->buf + arena->capacity) {
return NULL; return NULL;
} }
void *new_ptr = wapp_mem_arena_alloc(arena, new_size); void *new_ptr = wpMemArenaAlloc(arena, new_size);
if (!new_ptr) { if (!new_ptr) {
return NULL; return NULL;
} }
@@ -132,15 +132,15 @@ void *wapp_mem_arena_realloc(Arena *arena, void *ptr, u64 old_size, u64 new_size
return new_ptr; return new_ptr;
} }
void *wapp_mem_arena_realloc_aligned(Arena *arena, void *ptr, u64 old_size, u64 new_size, u64 alignment) { void *wpMemArenaReallocAligned(WpArena *arena, void *ptr, u64 old_size, u64 new_size, u64 alignment) {
wapp_debug_assert(arena != NULL, "`arena` should not be NULL"); wpDebugAssert(arena != NULL, "`arena` should not be NULL");
if ((u8*)ptr < arena->buf || (u8*)ptr > arena->offset || if ((u8*)ptr < arena->buf || (u8*)ptr > arena->offset ||
arena->offset + new_size >= arena->buf + arena->capacity) { arena->offset + new_size >= arena->buf + arena->capacity) {
return NULL; return NULL;
} }
void *new_ptr = wapp_mem_arena_alloc_aligned(arena, new_size, alignment); void *new_ptr = wpMemArenaAllocAligned(arena, new_size, alignment);
if (!new_ptr) { if (!new_ptr) {
return NULL; return NULL;
} }
@@ -151,8 +151,8 @@ void *wapp_mem_arena_realloc_aligned(Arena *arena, void *ptr, u64 old_size, u64
return new_ptr; return new_ptr;
} }
void wapp_mem_arena_temp_begin(Arena *arena) { void wpMemArenaTempBegin(WpArena *arena) {
wapp_debug_assert(arena != NULL, "`arena` should not be NULL"); wpDebugAssert(arena != NULL, "`arena` should not be NULL");
if (arena->prev_offset != NULL) { if (arena->prev_offset != NULL) {
return; return;
@@ -161,8 +161,8 @@ void wapp_mem_arena_temp_begin(Arena *arena) {
arena->prev_offset = arena->offset; arena->prev_offset = arena->offset;
} }
void wapp_mem_arena_temp_end(Arena *arena) { void wpMemArenaTempEnd(WpArena *arena) {
wapp_debug_assert(arena != NULL, "`arena` should not be NULL"); wpDebugAssert(arena != NULL, "`arena` should not be NULL");
if (arena->prev_offset == NULL) { if (arena->prev_offset == NULL) {
return; return;
@@ -172,20 +172,20 @@ void wapp_mem_arena_temp_end(Arena *arena) {
arena->prev_offset = NULL; arena->prev_offset = NULL;
} }
void wapp_mem_arena_clear(Arena *arena) { void wpMemArenaClear(WpArena *arena) {
wapp_debug_assert(arena != NULL, "`arena` should not be NULL"); wpDebugAssert(arena != NULL, "`arena` should not be NULL");
memset(arena->buf, 0, arena->offset - arena->buf); memset(arena->buf, 0, arena->offset - arena->buf);
arena->offset = arena->buf; arena->offset = arena->buf;
} }
void wapp_mem_arena_destroy(Arena **arena) { void wpMemArenaDestroy(WpArena **arena) {
wapp_debug_assert(arena != NULL && (*arena) != NULL, "`arena` double pointer is not valid"); wpDebugAssert(arena != NULL && (*arena) != NULL, "`arena` double pointer is not valid");
Arena *arena_ptr = *arena; WpArena *arena_ptr = *arena;
if (arena_ptr->type == ARENA_STORAGE_TYPE_ALLOCATED) { if (arena_ptr->type == ARENA_STORAGE_TYPE_ALLOCATED) {
wapp_os_mem_free(*arena, sizeof(Arena) + arena_ptr->capacity); wpOsMemFree(*arena, sizeof(WpArena) + arena_ptr->capacity);
} }
*arena = NULL; *arena = NULL;
+25 -25
View File
@@ -7,39 +7,39 @@
#include "../../../common/aliases/aliases.h" #include "../../../common/aliases/aliases.h"
#include "../../../common/platform/platform.h" #include "../../../common/platform/platform.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
typedef struct Arena Arena; typedef struct WpArena WpArena;
#define wapp_mem_arena_init_allocated(arena_dptr, base_capacity) \ #define wpMemArenaInitAllocated(arena_dptr, base_capacity) \
(wapp_mem_arena_init_allocated_custom(arena_dptr, base_capacity, WAPP_MEM_ALLOC_RESERVE, false)) (wpMemArenaInitAllocatedCustom(arena_dptr, base_capacity, WP_MEM_ALLOC_RESERVE, false))
#define wapp_mem_arena_init_allocated_commit(arena_dptr, base_capacity) \ #define wpMemArenaInitAllocatedCommit(arena_dptr, base_capacity) \
(wapp_mem_arena_init_allocated_custom(arena_dptr, base_capacity, WAPP_MEM_ALLOC_RESERVE | WAPP_MEM_ALLOC_COMMIT, false)) (wpMemArenaInitAllocatedCustom(arena_dptr, base_capacity, WP_MEM_ALLOC_RESERVE | WP_MEM_ALLOC_COMMIT, false))
#define wapp_mem_arena_init_allocated_zero(arena_dptr, base_capacity) \ #define wpMemArenaInitAllocatedZero(arena_dptr, base_capacity) \
(wapp_mem_arena_init_allocated_custom(arena_dptr, base_capacity, WAPP_MEM_ALLOC_RESERVE, true)) (wpMemArenaInitAllocatedCustom(arena_dptr, base_capacity, WP_MEM_ALLOC_RESERVE, true))
#define wapp_mem_arena_init_allocated_commit_and_zero(arena_dptr, base_capacity) \ #define wpMemArenaInitAllocatedCommitAndZero(arena_dptr, base_capacity) \
(wapp_mem_arena_init_allocated_custom(arena_dptr, base_capacity, WAPP_MEM_ALLOC_RESERVE | WAPP_MEM_ALLOC_COMMIT, true)) (wpMemArenaInitAllocatedCustom(arena_dptr, base_capacity, WP_MEM_ALLOC_RESERVE | WP_MEM_ALLOC_COMMIT, true))
/** /**
* Arena initialisation function. `wapp_mem_arena_init_allocated_custom` provides the most * WpArena initialisation function. `wpMemArenaInitAllocatedCustom` provides the most
* control over how the Arena is initialised. Wrapper macros are provided for * control over how the WpArena is initialised. Wrapper macros are provided for
* easier use. * easier use.
*/ */
b8 wapp_mem_arena_init_allocated_custom(Arena **arena, u64 base_capacity, MemAllocFlags flags, b8 zero_buffer); b8 wpMemArenaInitAllocatedCustom(WpArena **arena, u64 base_capacity, WpMemAllocFlags flags, b8 zero_buffer);
b8 wapp_mem_arena_init_buffer(Arena **arena, u8 *buffer, u64 buffer_size); b8 wpMemArenaInitBuffer(WpArena **arena, u8 *buffer, u64 buffer_size);
void *wapp_mem_arena_alloc(Arena *arena, u64 size); void *wpMemArenaAlloc(WpArena *arena, u64 size);
void *wapp_mem_arena_alloc_aligned(Arena *arena, u64 size, u64 alignment); void *wpMemArenaAllocAligned(WpArena *arena, u64 size, u64 alignment);
void *wapp_mem_arena_realloc(Arena *arena, void *ptr, u64 old_size, u64 new_size); void *wpMemArenaRealloc(WpArena *arena, void *ptr, u64 old_size, u64 new_size);
void *wapp_mem_arena_realloc_aligned(Arena *arena, void *ptr, u64 old_size, u64 new_size, u64 alignment); void *wpMemArenaReallocAligned(WpArena *arena, void *ptr, u64 old_size, u64 new_size, u64 alignment);
void wapp_mem_arena_temp_begin(Arena *arena); void wpMemArenaTempBegin(WpArena *arena);
void wapp_mem_arena_temp_end(Arena *arena); void wpMemArenaTempEnd(WpArena *arena);
void wapp_mem_arena_clear(Arena *arena); void wpMemArenaClear(WpArena *arena);
void wapp_mem_arena_destroy(Arena **arena); void wpMemArenaDestroy(WpArena **arena);
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !MEM_ARENA_H #endif // !MEM_ARENA_H
+43 -43
View File
@@ -6,82 +6,82 @@
#include "../../../common/aliases/aliases.h" #include "../../../common/aliases/aliases.h"
#include "../../../common/assert/assert.h" #include "../../../common/assert/assert.h"
wapp_intern void initialise_arena_allocator(Allocator *allocator); wp_intern void initialiseArenaAllocator(WpAllocator *allocator);
wapp_intern void *mem_arena_alloc(u64 size, void *alloc_obj); wp_intern void *memArenaAlloc(u64 size, void *alloc_obj);
wapp_intern void *mem_arena_alloc_aligned(u64 size, u64 alignment, void *alloc_obj); wp_intern void *memArenaAllocAligned(u64 size, u64 alignment, void *alloc_obj);
wapp_intern void *mem_arena_realloc(void *ptr, u64 old_size, u64 new_size, void *alloc_obj); wp_intern void *memArenaRealloc(void *ptr, u64 old_size, u64 new_size, void *alloc_obj);
wapp_intern void *mem_arena_realloc_aligned(void *ptr, u64 old_size, u64 new_size, u64 alignment, wp_intern void *memArenaReallocAligned(void *ptr, u64 old_size, u64 new_size, u64 alignment,
void *alloc_obj); void *alloc_obj);
Allocator wapp_mem_arena_allocator_init_with_buffer(u8 *buffer, u64 buffer_size) { WpAllocator wpMemArenaAllocatorInitWithBuffer(u8 *buffer, u64 buffer_size) {
Allocator allocator = {0}; WpAllocator allocator = {0};
b8 initialised = wapp_mem_arena_init_buffer((Arena **)(&allocator.obj), buffer, buffer_size); b8 initialised = wpMemArenaInitBuffer((WpArena **)(&allocator.obj), buffer, buffer_size);
if (!initialised) { if (!initialised) {
return allocator; return allocator;
} }
initialise_arena_allocator(&allocator); initialiseArenaAllocator(&allocator);
return allocator; return allocator;
} }
Allocator wapp_mem_arena_allocator_init_custom(u64 base_capacity, MemAllocFlags flags, b8 zero_buffer) { WpAllocator wpMemArenaAllocatorInitCustom(u64 base_capacity, WpMemAllocFlags flags, b8 zero_buffer) {
Allocator allocator = {0}; WpAllocator allocator = {0};
b8 initialised = wapp_mem_arena_init_allocated_custom((Arena **)(&allocator.obj), base_capacity, flags, zero_buffer); b8 initialised = wpMemArenaInitAllocatedCustom((WpArena **)(&allocator.obj), base_capacity, flags, zero_buffer);
if (!initialised) { if (!initialised) {
return allocator; return allocator;
} }
initialise_arena_allocator(&allocator); initialiseArenaAllocator(&allocator);
return allocator; return allocator;
} }
void wapp_mem_arena_allocator_temp_begin(const Allocator *allocator) { void wpMemArenaAllocatorTempBegin(const WpAllocator *allocator) {
wapp_debug_assert(allocator != NULL, "`allocator` should not be NULL"); wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
wapp_mem_arena_temp_begin((Arena *)(allocator->obj)); wpMemArenaTempBegin((WpArena *)(allocator->obj));
} }
void wapp_mem_arena_allocator_temp_end(const Allocator *allocator) { void wpMemArenaAllocatorTempEnd(const WpAllocator *allocator) {
wapp_debug_assert(allocator != NULL, "`allocator` should not be NULL"); wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
wapp_mem_arena_temp_end((Arena *)(allocator->obj)); wpMemArenaTempEnd((WpArena *)(allocator->obj));
} }
void wapp_mem_arena_allocator_clear(Allocator *allocator) { void wpMemArenaAllocatorClear(WpAllocator *allocator) {
wapp_debug_assert(allocator != NULL, "`allocator` should not be NULL"); wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
wapp_mem_arena_clear((Arena *)(allocator->obj)); wpMemArenaClear((WpArena *)(allocator->obj));
} }
void wapp_mem_arena_allocator_destroy(Allocator *allocator) { void wpMemArenaAllocatorDestroy(WpAllocator *allocator) {
wapp_debug_assert(allocator != NULL, "`allocator` should not be NULL"); wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
wapp_mem_arena_destroy((Arena **)(&(allocator->obj))); wpMemArenaDestroy((WpArena **)(&(allocator->obj)));
*allocator = (Allocator){0}; *allocator = (WpAllocator){0};
} }
wapp_intern void initialise_arena_allocator(Allocator *allocator) { wp_intern void initialiseArenaAllocator(WpAllocator *allocator) {
allocator->alloc = mem_arena_alloc; allocator->alloc = memArenaAlloc;
allocator->alloc_aligned = mem_arena_alloc_aligned; allocator->alloc_aligned = memArenaAllocAligned;
allocator->realloc = mem_arena_realloc; allocator->realloc = memArenaRealloc;
allocator->realloc_aligned = mem_arena_realloc_aligned; allocator->realloc_aligned = memArenaReallocAligned;
} }
wapp_intern void *mem_arena_alloc(u64 size, void *alloc_obj) { wp_intern void *memArenaAlloc(u64 size, void *alloc_obj) {
Arena *arena = (Arena *)alloc_obj; WpArena *arena = (WpArena *)alloc_obj;
return wapp_mem_arena_alloc(arena, size); return wpMemArenaAlloc(arena, size);
} }
wapp_intern void *mem_arena_alloc_aligned(u64 size, u64 alignment, void *alloc_obj) { wp_intern void *memArenaAllocAligned(u64 size, u64 alignment, void *alloc_obj) {
Arena *arena = (Arena *)alloc_obj; WpArena *arena = (WpArena *)alloc_obj;
return wapp_mem_arena_alloc_aligned(arena, size, alignment); return wpMemArenaAllocAligned(arena, size, alignment);
} }
wapp_intern void *mem_arena_realloc(void *ptr, u64 old_size, u64 new_size, void *alloc_obj) { wp_intern void *memArenaRealloc(void *ptr, u64 old_size, u64 new_size, void *alloc_obj) {
Arena *arena = (Arena *)alloc_obj; WpArena *arena = (WpArena *)alloc_obj;
return wapp_mem_arena_realloc(arena, ptr, old_size, new_size); return wpMemArenaRealloc(arena, ptr, old_size, new_size);
} }
wapp_intern void *mem_arena_realloc_aligned(void *ptr, u64 old_size, u64 new_size, u64 alignment, wp_intern void *memArenaReallocAligned(void *ptr, u64 old_size, u64 new_size, u64 alignment,
void *alloc_obj) { void *alloc_obj) {
Arena *arena = (Arena *)alloc_obj; WpArena *arena = (WpArena *)alloc_obj;
return wapp_mem_arena_realloc_aligned(arena, ptr, old_size, new_size, alignment); return wpMemArenaReallocAligned(arena, ptr, old_size, new_size, alignment);
} }
+23 -23
View File
@@ -8,39 +8,39 @@
#include "../../../common/platform/platform.h" #include "../../../common/platform/platform.h"
#include "../../../base/mem/allocator/mem_allocator.h" #include "../../../base/mem/allocator/mem_allocator.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#define wapp_mem_arena_allocator_init(base_capacity) \ #define wpMemArenaAllocatorInit(base_capacity) \
(wapp_mem_arena_allocator_init_custom(base_capacity, WAPP_MEM_ALLOC_RESERVE, false)) (wpMemArenaAllocatorInitCustom(base_capacity, WP_MEM_ALLOC_RESERVE, false))
#define wapp_mem_arena_allocator_init_commit(base_capacity) \ #define wpMemArenaAllocatorInitCommit(base_capacity) \
(wapp_mem_arena_allocator_init_custom(base_capacity, WAPP_MEM_ALLOC_RESERVE | WAPP_MEM_ALLOC_COMMIT, false)) (wpMemArenaAllocatorInitCustom(base_capacity, WP_MEM_ALLOC_RESERVE | WP_MEM_ALLOC_COMMIT, false))
#define wapp_mem_arena_allocator_init_zero(base_capacity) \ #define wpMemArenaAllocatorInitZero(base_capacity) \
(wapp_mem_arena_allocator_init_custom(base_capacity, WAPP_MEM_ALLOC_RESERVE, true)) (wpMemArenaAllocatorInitCustom(base_capacity, WP_MEM_ALLOC_RESERVE, true))
#define wapp_mem_arena_allocator_init_commit_and_zero(base_capacity) \ #define wpMemArenaAllocatorInitCommitAndZero(base_capacity) \
(wapp_mem_arena_allocator_init_custom(base_capacity, WAPP_MEM_ALLOC_RESERVE | WAPP_MEM_ALLOC_COMMIT, true)) (wpMemArenaAllocatorInitCustom(base_capacity, WP_MEM_ALLOC_RESERVE | WP_MEM_ALLOC_COMMIT, true))
/** /**
* Wraps an Arena in an Allocator object. It attempts to initialise the Arena * Wraps a WpArena in a WpAllocator object. It attempts to initialise the WpArena
* and, if successful, defines the operations supported by it to be used by the * and, if successful, defines the operations supported by it to be used by the
* Allocator. * WpAllocator.
* *
* An Arena allocator only supports normal allocation and aligned allocation. * An WpArena allocator only supports normal allocation and aligned allocation.
* Reallocation, aligned reallocation and freeing aren't implemented. * Reallocation, aligned reallocation and freeing aren't implemented.
* *
* The `wapp_mem_arena_allocator_init_custom` provides the most control over how * The `wpMemArenaAllocatorInitCustom` provides the most control over how
* the Arena is initialised. Wrapper macros are provided for easier use. * the WpArena is initialised. Wrapper macros are provided for easier use.
*/ */
Allocator wapp_mem_arena_allocator_init_custom(u64 base_capacity, MemAllocFlags flags, b8 zero_buffer); WpAllocator wpMemArenaAllocatorInitCustom(u64 base_capacity, WpMemAllocFlags flags, b8 zero_buffer);
Allocator wapp_mem_arena_allocator_init_with_buffer(u8 *buffer, u64 buffer_size); WpAllocator wpMemArenaAllocatorInitWithBuffer(u8 *buffer, u64 buffer_size);
void wapp_mem_arena_allocator_temp_begin(const Allocator *allocator); void wpMemArenaAllocatorTempBegin(const WpAllocator *allocator);
void wapp_mem_arena_allocator_temp_end(const Allocator *allocator); void wpMemArenaAllocatorTempEnd(const WpAllocator *allocator);
void wapp_mem_arena_allocator_clear(Allocator *allocator); void wpMemArenaAllocatorClear(WpAllocator *allocator);
void wapp_mem_arena_allocator_destroy(Allocator *allocator); void wpMemArenaAllocatorDestroy(WpAllocator *allocator);
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !MEM_ARENA_ALLOCATOR_H #endif // !MEM_ARENA_ALLOCATOR_H
+37 -39
View File
@@ -8,128 +8,126 @@
#include "../../base/mem/allocator/mem_allocator.h" #include "../../base/mem/allocator/mem_allocator.h"
#include "../../base/strings/str8/str8.h" #include "../../base/strings/str8/str8.h"
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h>
#include <string.h>
u32 wapp_cpath_join_path(Str8 *dst, const Str8List *parts) { u32 wpCpathJoinPath(WpStr8 *dst, const WpStr8List *parts) {
if (!dst || !parts) { if (!dst || !parts) {
return CPATH_JOIN_INVALID_ARGS; return WP_CPATH_JOIN_RESULT_INVALID_ARGS;
} }
if (parts->node_count == 0) { if (parts->node_count == 0) {
return CPATH_JOIN_EMPTY_PARTS; return WP_CPATH_JOIN_RESULT_EMPTY_PARTS;
} }
Str8 separator = wapp_str8_buf(4); WpStr8 separator = wpStr8Buf(4);
wapp_str8_push_back(&separator, WAPP_PATH_SEP); wpStr8PushBack(&separator, WP_PATH_SEP);
u64 required_capacity = parts->node_count * separator.size + wapp_str8_list_total_size(parts); u64 required_capacity = parts->node_count * separator.size + wpStr8ListTotalSize(parts);
if (dst->capacity < required_capacity) { if (dst->capacity < required_capacity) {
return CPATH_JOIN_INSUFFICIENT_DST_CAPACITY; return WP_CPATH_JOIN_RESULT_INSUFFICIENT_DST_CAPACITY;
} }
// Handle first node // Handle first node
Str8 *first_node = wapp_dbl_list_get(Str8, parts, 0); WpStr8 *first_node = wpDblListGet(WpStr8, parts, 0);
wapp_str8_copy_str8_capped(dst, first_node); wpStr8CopyStr8Capped(dst, first_node);
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of // NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
// MSVC Spectre mitigation warnings // MSVC Spectre mitigation warnings
Str8 *node = first_node; WpStr8 *node = first_node;
u64 node_index = 1; u64 node_index = 1;
b8 running = node_index < parts->node_count; b8 running = node_index < parts->node_count;
while (running) { while (running) {
node = wapp_dbl_list_get(Str8, parts, node_index); node = wpDblListGet(WpStr8, parts, node_index);
if (node->size == 0) { if (node->size == 0) {
goto CPATH_JOIN_LOOP_END; goto CPATH_JOIN_LOOP_END;
} }
if (dst->size > 0) { if (dst->size > 0) {
char dst_last = wapp_str8_get(dst, dst->size - 1); char dst_last = wpStr8Get(dst, dst->size - 1);
char node_start = wapp_str8_get(node, 0); char node_start = wpStr8Get(node, 0);
b8 add_path_sep = dst_last != WAPP_PATH_SEP && node_start != WAPP_PATH_SEP; b8 add_path_sep = dst_last != WP_PATH_SEP && node_start != WP_PATH_SEP;
if (add_path_sep) { if (add_path_sep) {
wapp_str8_concat_capped(dst, &separator); wpStr8ConcatCapped(dst, &separator);
} }
} }
wapp_str8_concat_capped(dst, node); wpStr8ConcatCapped(dst, node);
CPATH_JOIN_LOOP_END: CPATH_JOIN_LOOP_END:
++node_index; ++node_index;
running = node_index < parts->node_count; running = node_index < parts->node_count;
} }
return CPATH_JOIN_SUCCESS; return WP_CPATH_JOIN_RESULT_SUCCESS;
} }
Str8 *dirup(const Allocator *allocator, Str8RO *path, u64 levels) { WpStr8 *dirUp(const WpAllocator *allocator, WpStr8RO *path, u64 levels) {
Str8 *output = NULL; WpStr8 *output = NULL;
if (!allocator || !path) { if (!allocator || !path) {
goto RETURN_DIRUP; goto RETURN_DIRUP;
} }
b8 absolute = wapp_str8_get(path, 0) == WAPP_PATH_SEP; b8 absolute = wpStr8Get(path, 0) == WP_PATH_SEP;
Str8 separator = wapp_str8_buf(4); WpStr8 separator = wpStr8Buf(4);
wapp_str8_push_back(&separator, WAPP_PATH_SEP); wpStr8PushBack(&separator, WP_PATH_SEP);
if (path->size == 0) { if (path->size == 0) {
output = wapp_str8_alloc_buf(allocator, 16); output = wpStr8AllocBuf(allocator, 16);
if (!output) { if (!output) {
goto RETURN_DIRUP; goto RETURN_DIRUP;
} }
wapp_str8_push_back(output, absolute ? WAPP_PATH_SEP : '.'); wpStr8PushBack(output, absolute ? WP_PATH_SEP : '.');
goto RETURN_DIRUP; goto RETURN_DIRUP;
} }
if (levels < 1) { if (levels < 1) {
output = wapp_str8_alloc_str8(allocator, path); output = wpStr8AllocStr8(allocator, path);
goto RETURN_DIRUP; goto RETURN_DIRUP;
} }
Allocator tmp_arena = wapp_mem_arena_allocator_init(MiB(8)); WpAllocator tmp_arena = wpMemArenaAllocatorInit(MiB(8));
if (wapp_mem_allocator_invalid(&tmp_arena)) { if (wpMemAllocatorInvalid(&tmp_arena)) {
goto RETURN_DIRUP; goto RETURN_DIRUP;
} }
Str8List *parts = wapp_str8_split(&tmp_arena, path, &separator); WpStr8List *parts = wpStr8Split(&tmp_arena, path, &separator);
if (!parts) { if (!parts) {
goto RETURN_DIRUP; goto RETURN_DIRUP;
} }
if (levels >= parts->node_count) { if (levels >= parts->node_count) {
output = wapp_str8_alloc_buf(allocator, 16); output = wpStr8AllocBuf(allocator, 16);
if (!output) { if (!output) {
goto LIST_CLEANUP_DIRUP; goto LIST_CLEANUP_DIRUP;
} }
wapp_str8_push_back(output, absolute ? WAPP_PATH_SEP : '.'); wpStr8PushBack(output, absolute ? WP_PATH_SEP : '.');
} else { } else {
for (u64 i = 0; i < levels; ++i) { for (u64 i = 0; i < levels; ++i) {
wapp_dbl_list_pop_back(Str8, parts); wpDblListPopBack(WpStr8, parts);
} }
u64 alignment = sizeof(void *) * 2; u64 alignment = sizeof(void *) * 2;
u64 alloc_size = wapp_str8_list_total_size(parts) + parts->node_count * separator.size; u64 alloc_size = wpStr8ListTotalSize(parts) + parts->node_count * separator.size;
u64 modulo = alloc_size & (alignment - 1); u64 modulo = alloc_size & (alignment - 1);
alloc_size += alignment - modulo; alloc_size += alignment - modulo;
output = wapp_str8_alloc_buf(allocator, alloc_size); output = wpStr8AllocBuf(allocator, alloc_size);
if (output) { if (output) {
if (absolute) { if (absolute) {
wapp_str8_push_back(output, WAPP_PATH_SEP); wpStr8PushBack(output, WP_PATH_SEP);
} }
Str8 *joined = wapp_str8_join(&tmp_arena, parts, &separator); WpStr8 *joined = wpStr8Join(&tmp_arena, parts, &separator);
if (joined) { if (joined) {
wapp_str8_concat_capped(output, joined); wpStr8ConcatCapped(output, joined);
} }
} }
} }
LIST_CLEANUP_DIRUP: LIST_CLEANUP_DIRUP:
wapp_mem_arena_allocator_destroy(&tmp_arena); wpMemArenaAllocatorDestroy(&tmp_arena);
RETURN_DIRUP: RETURN_DIRUP:
return output; return output;
+20 -20
View File
@@ -8,38 +8,38 @@
#include "../../base/mem/allocator/mem_allocator.h" #include "../../base/mem/allocator/mem_allocator.h"
#include "../../base/strings/str8/str8.h" #include "../../base/strings/str8/str8.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#ifdef WAPP_PLATFORM_POSIX #ifdef WP_PLATFORM_POSIX
#include <limits.h> #include <limits.h>
#define WAPP_PATH_SEP '/' #define WP_PATH_SEP '/'
#define WAPP_PATH_MAX PATH_MAX #define WP_PATH_MAX PATH_MAX
#elif defined(WAPP_PLATFORM_WINDOWS) #elif defined(WP_PLATFORM_WINDOWS)
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <Windows.h> #include <Windows.h>
#define WAPP_PATH_SEP '\\' #define WP_PATH_SEP '\\'
#define WAPP_PATH_MAX MAX_PATH #define WP_PATH_MAX MAX_PATH
#else #else
#error "Unrecognised platform" #error "Unrecognised platform"
#endif #endif
#define wapp_cpath_dirname(ALLOCATOR, PATH) dirup(ALLOCATOR, PATH, 1) #define wpCpathDirname(ALLOCATOR, PATH) dirUp(ALLOCATOR, PATH, 1)
#define wapp_cpath_dirup(ALLOCATOR, PATH, COUNT) dirup(ALLOCATOR, PATH, COUNT) #define wpCpathDirUp(ALLOCATOR, PATH, COUNT) dirUp(ALLOCATOR, PATH, COUNT)
enum { typedef enum WpCpathJoinResult {
CPATH_JOIN_SUCCESS = 0, WP_CPATH_JOIN_RESULT_SUCCESS = 0,
CPATH_JOIN_INVALID_ARGS, WP_CPATH_JOIN_RESULT_INVALID_ARGS,
CPATH_JOIN_EMPTY_PARTS, WP_CPATH_JOIN_RESULT_EMPTY_PARTS,
CPATH_JOIN_INSUFFICIENT_DST_CAPACITY, WP_CPATH_JOIN_RESULT_INSUFFICIENT_DST_CAPACITY,
}; } WpCpathJoinResult;
u32 wapp_cpath_join_path(Str8 *dst, const Str8List *parts); WpCpathJoinResult wpCpathJoinPath(WpStr8 *dst, const WpStr8List *parts);
Str8 *dirup(const Allocator *allocator, Str8RO *path, u64 levels); WpStr8 *dirUp(const WpAllocator *allocator, WpStr8RO *path, u64 levels);
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !CPATH_H #endif // !CPATH_H
+61 -51
View File
@@ -7,67 +7,77 @@
#include "../../base/array/array.h" #include "../../base/array/array.h"
#include "../../base/strings/str8/str8.h" #include "../../base/strings/str8/str8.h"
WFile *wapp_file_open(const Allocator *allocator, Str8RO *filepath, FileAccessMode mode) { WpFile *wpFileOpen(const WpAllocator *allocator, WpStr8RO *filepath, WpFileAccessMode mode) {
wapp_debug_assert(allocator != NULL && filepath != NULL, "`allocator` and `filepath` should not be NULL"); wpDebugAssert(allocator != NULL && filepath != NULL, "`allocator` and `filepath` should not be NULL");
wapp_debug_assert(filepath->size < WAPP_PATH_MAX, "`filepath` exceeds max path limit."); wpDebugAssert(filepath->size < WP_PATH_MAX, "`filepath` exceeds max path limit.");
return _file_open(allocator, filepath, mode); return fileOpen(allocator, filepath, mode);
} }
i64 wapp_file_get_current_position(WFile *file) { i64 wpFileGetCurrentPosition(WpFile *file) {
wapp_debug_assert(file != NULL, "`file` should not be NULL."); wpDebugAssert(file != NULL, "`file` should not be NULL.");
return _file_seek(file, 0, WAPP_SEEK_CURRENT); return fileSeek(file, 0, WP_SEEK_CURRENT);
} }
i64 wapp_file_seek(WFile *file, i64 offset, FileSeekOrigin origin) { i64 wpFileSeek(WpFile *file, i64 offset, WpFileSeekOrigin origin) {
wapp_debug_assert(file != NULL, "`file` should not be NULL."); wpDebugAssert(file != NULL, "`file` should not be NULL.");
return _file_seek(file, offset, origin); return fileSeek(file, offset, origin);
} }
i64 wapp_file_get_length(WFile *file) { i64 wpFileGetLength(WpFile *file) {
wapp_debug_assert(file != NULL, "`file` should not be NULL."); wpDebugAssert(file != NULL, "`file` should not be NULL.");
i64 current = wapp_file_get_current_position(file); i64 current = wpFileGetCurrentPosition(file);
_file_seek(file, 0, WAPP_SEEK_END); fileSeek(file, 0, WP_SEEK_END);
i64 output = wapp_file_get_current_position(file); i64 output = wpFileGetCurrentPosition(file);
// Restore position // Restore position
_file_seek(file, current, WAPP_SEEK_START); fileSeek(file, current, WP_SEEK_START);
return output; return output;
} }
u64 wapp_file_read(void *dst_buf, WFile *file, u64 byte_count) { u64 wpFileRead(void *dst_buf, WpFile *file, u64 byte_count) {
wapp_debug_assert(dst_buf != NULL && file != NULL, wpDebugAssert(dst_buf != NULL && file != NULL,
"`dst_buf` and `file` should not be NULL."); "`dst_buf` and `file` should not be NULL.");
i64 file_length = wapp_file_get_length(file); i64 file_length = wpFileGetLength(file);
if (file_length < 0) { if (file_length < 0) {
return 0; return 0;
} }
return _file_read(dst_buf, byte_count, file, file_length); return fileRead(dst_buf, byte_count, file, file_length);
} }
i64 wapp_file_write(const void *src_buf, WFile *file, u64 byte_count) { i64 wpFileWrite(const void *src_buf, WpFile *file, u64 byte_count) {
wapp_debug_assert(src_buf != NULL && file != NULL, wpDebugAssert(src_buf != NULL && file != NULL,
"`src_buf` and `file` should not be NULL."); "`src_buf` and `file` should not be NULL.");
return _file_write(src_buf, file, byte_count); return fileWrite(src_buf, file, byte_count);
} }
u64 wapp_file_read_array(GenericArray dst_buf, WFile *file, u64 item_count) { u64 wpFileReadStr8(WpStr8 *str, WpFile *file) {
wapp_debug_assert(dst_buf != NULL && file != NULL, wpDebugAssert(str != NULL, "`str` should not be NULL.");
return wpFileRead((void *)(str->buf), file, str->size);
}
i64 wpFileWriteStr8(WpStr8RO *str, WpFile *file) {
wpDebugAssert(str != NULL, "`str` should not be NULL.");
return wpFileWrite((void *)(str->buf), file, str->size);
}
u64 wpFileReadArray(WpArray dst_buf, WpFile *file, u64 item_count) {
wpDebugAssert(dst_buf != NULL && file != NULL,
"`dst_buf` and `file` should not be NULL."); "`dst_buf` and `file` should not be NULL.");
i64 _file_length = wapp_file_get_length(file); i64 _file_length = wpFileGetLength(file);
if (_file_length < 0) { if (_file_length < 0) {
return 0; return 0;
} }
u64 file_length = (u64)_file_length; u64 file_length = (u64)_file_length;
u64 item_size = wapp_array_item_size(dst_buf); u64 item_size = wpArrayItemSize(dst_buf);
u64 dst_byte_capacity = wapp_array_capacity(dst_buf) * item_size; u64 dst_byte_capacity = wpArrayCapacity(dst_buf) * item_size;
u64 req_byte_count = item_count * item_size; u64 req_byte_count = item_count * item_size;
u64 copy_byte_count = 0; u64 copy_byte_count = 0;
@@ -77,26 +87,26 @@ u64 wapp_file_read_array(GenericArray dst_buf, WFile *file, u64 item_count) {
copy_byte_count = file_length <= dst_byte_capacity ? file_length : dst_byte_capacity; copy_byte_count = file_length <= dst_byte_capacity ? file_length : dst_byte_capacity;
} }
u64 byte_count = _file_read(dst_buf, copy_byte_count, file, file_length); u64 byte_count = fileRead(dst_buf, copy_byte_count, file, file_length);
if (byte_count == 0) { if (byte_count == 0) {
return 0; return 0;
} }
wapp_array_set_count(dst_buf, byte_count / item_size); wpArraySetCount(dst_buf, byte_count / item_size);
return wapp_array_count(dst_buf); return wpArrayCount(dst_buf);
} }
i64 wapp_file_write_array(const GenericArray src_buf, WFile *file, u64 item_count) { i64 wpFileWriteArray(const WpArray src_buf, WpFile *file, u64 item_count) {
wapp_debug_assert(src_buf != NULL && file != NULL, wpDebugAssert(src_buf != NULL && file != NULL,
"`src_buf` and `file` should not be NULL."); "`src_buf` and `file` should not be NULL.");
u64 item_size = wapp_array_item_size(src_buf); u64 item_size = wpArrayItemSize(src_buf);
u64 src_byte_count = wapp_array_count(src_buf) * item_size; u64 src_byte_count = wpArrayCount(src_buf) * item_size;
u64 req_byte_count = item_count * item_size; u64 req_byte_count = item_count * item_size;
u64 to_copy = req_byte_count <= src_byte_count ? req_byte_count : src_byte_count; u64 to_copy = req_byte_count <= src_byte_count ? req_byte_count : src_byte_count;
i64 bytes_written = _file_write(src_buf, file, to_copy); i64 bytes_written = fileWrite(src_buf, file, to_copy);
if (bytes_written < 0) { if (bytes_written < 0) {
return 0; return 0;
} }
@@ -104,26 +114,26 @@ i64 wapp_file_write_array(const GenericArray src_buf, WFile *file, u64 item_coun
return (u64)bytes_written / item_size; return (u64)bytes_written / item_size;
} }
i32 wapp_file_flush(WFile *file) { i32 wpFileFlush(WpFile *file) {
wapp_debug_assert(file != NULL, "`file` should not be NULL."); wpDebugAssert(file != NULL, "`file` should not be NULL.");
return _file_flush(file); return fileFlush(file);
} }
i32 wapp_file_close(WFile *file) { i32 wpFileClose(WpFile *file) {
wapp_debug_assert(file != NULL, "`file` should not be NULL."); wpDebugAssert(file != NULL, "`file` should not be NULL.");
return _file_close(file); return fileClose(file);
} }
i32 wapp_file_rename(Str8RO *old_filepath, Str8RO *new_filepath) { i32 wpFileRename(WpStr8RO *old_filepath, WpStr8RO *new_filepath) {
wapp_debug_assert(old_filepath != NULL && new_filepath != NULL, wpDebugAssert(old_filepath != NULL && new_filepath != NULL,
"`old_filepath` and `new_filepath` should not be NULL"); "`old_filepath` and `new_filepath` should not be NULL");
wapp_debug_assert(old_filepath->size < WAPP_PATH_MAX, "`old_filepath` exceeds max path limit."); wpDebugAssert(old_filepath->size < WP_PATH_MAX, "`old_filepath` exceeds max path limit.");
wapp_debug_assert(new_filepath->size < WAPP_PATH_MAX, "`new_filepath` exceeds max path limit."); wpDebugAssert(new_filepath->size < WP_PATH_MAX, "`new_filepath` exceeds max path limit.");
return _file_rename(old_filepath, new_filepath); return fileRename(old_filepath, new_filepath);
} }
i32 wapp_file_remove(Str8RO *filepath) { i32 wpFileRemove(WpStr8RO *filepath) {
wapp_debug_assert(filepath != NULL, "`filepath` should not be NULL"); wpDebugAssert(filepath != NULL, "`filepath` should not be NULL");
wapp_debug_assert(filepath->size < WAPP_PATH_MAX, "`filepath` exceeds max path limit."); wpDebugAssert(filepath->size < WP_PATH_MAX, "`filepath` exceeds max path limit.");
return _file_remove(filepath); return fileRemove(filepath);
} }
+50 -48
View File
@@ -7,69 +7,71 @@
#include "../../common/aliases/aliases.h" #include "../../common/aliases/aliases.h"
#include "../../base/strings/str8/str8.h" #include "../../base/strings/str8/str8.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
typedef struct WFile WFile; typedef struct WpFile WpFile;
typedef enum { typedef enum WpFileAccessMode {
WAPP_ACCESS_READ, // Equivalent to r WP_ACCESS_READ, // Equivalent to r
WAPP_ACCESS_WRITE, // Equivalent to w WP_ACCESS_WRITE, // Equivalent to w
WAPP_ACCESS_APPEND, // Equivalent to a WP_ACCESS_APPEND, // Equivalent to a
WAPP_ACCESS_READ_EX, // Equivalent to r+ WP_ACCESS_READ_EX, // Equivalent to r+
WAPP_ACCESS_WRITE_EX, // Equivalent to w+ WP_ACCESS_WRITE_EX, // Equivalent to w+
WAPP_ACCESS_APPEND_EX, // Equivalent to a+ WP_ACCESS_APPEND_EX, // Equivalent to a+
WAPP_ACCESS_WRITE_FAIL_ON_EXIST, // Equivalent to wx WP_ACCESS_WRITE_FAIL_ON_EXIST, // Equivalent to wx
WAPP_ACCESS_WRITE_FAIL_ON_EXIST_EX, // Equivalent to wx+ WP_ACCESS_WRITE_FAIL_ON_EXIST_EX, // Equivalent to wx+
FILE_ACCESS_MODE_COUNT, COUNT_FILE_ACCESS_MODE,
} FileAccessMode; } WpFileAccessMode;
typedef enum { typedef enum WpFileSeekOrigin {
WAPP_SEEK_START, WP_SEEK_START,
WAPP_SEEK_CURRENT, WP_SEEK_CURRENT,
WAPP_SEEK_END, WP_SEEK_END,
FILE_SEEK_ORIGIN_COUNT, COUNT_FILE_SEEK_ORIGIN,
} FileSeekOrigin; } WpFileSeekOrigin;
// Return value should not be cached as it's not guaranteed to remain the same. Always call // Return value should not be cached as it's not guaranteed to remain the same. Always call
// wapp_file_stdin to get the standard input stream // wpFileStdin to get the standard input stream
wapp_extern WFile *wapp_file_stdin(void); wp_extern WpFile *wpFileStdin(void);
// Return value should not be cached as it's not guaranteed to remain the same. Always call // Return value should not be cached as it's not guaranteed to remain the same. Always call
// wapp_file_stdout to get the standard output stream // wpFileStdout to get the standard output stream
wapp_extern WFile *wapp_file_stdout(void); wp_extern WpFile *wpFileStdout(void);
// Return value should not be cached as it's not guaranteed to remain the same. Always call // Return value should not be cached as it's not guaranteed to remain the same. Always call
// wapp_file_stderr to get the standard error stream // wpFileStderr to get the standard error stream
wapp_extern WFile *wapp_file_stderr(void); wp_extern WpFile *wpFileStderr(void);
WFile *wapp_file_open(const Allocator *allocator, Str8RO *filepath, FileAccessMode mode); WpFile *wpFileOpen(const WpAllocator *allocator, WpStr8RO *filepath, WpFileAccessMode mode);
i64 wapp_file_get_current_position(WFile *file); i64 wpFileGetCurrentPosition(WpFile *file);
i64 wapp_file_seek(WFile *file, i64 offset, FileSeekOrigin origin); i64 wpFileSeek(WpFile *file, i64 offset, WpFileSeekOrigin origin);
i64 wapp_file_get_length(WFile *file); i64 wpFileGetLength(WpFile *file);
u64 wapp_file_read(void *dst_buf, WFile *file, u64 byte_count); u64 wpFileRead(void *dst_buf, WpFile *file, u64 byte_count);
i64 wapp_file_write(const void *src_buf, WFile *file, u64 byte_count); i64 wpFileWrite(const void *src_buf, WpFile *file, u64 byte_count);
u64 wapp_file_read_array(GenericArray dst_buf, WFile *file, u64 item_count); u64 wpFileReadStr8(WpStr8 *str, WpFile *file);
i64 wapp_file_write_array(const GenericArray src_buf, WFile *file, u64 item_count); i64 wpFileWriteStr8(WpStr8RO *str, WpFile *file);
i32 wapp_file_flush(WFile *file); u64 wpFileReadArray(WpArray dst_buf, WpFile *file, u64 item_count);
i32 wapp_file_close(WFile *file); i64 wpFileWriteArray(const WpArray src_buf, WpFile *file, u64 item_count);
i32 wapp_file_rename(Str8RO *old_filepath, Str8RO *new_filepath); i32 wpFileFlush(WpFile *file);
i32 wapp_file_remove(Str8RO *filepath); i32 wpFileClose(WpFile *file);
i32 wpFileRename(WpStr8RO *old_filepath, WpStr8RO *new_filepath);
i32 wpFileRemove(WpStr8RO *filepath);
wapp_extern WFile *_file_open(const Allocator *allocator, Str8RO *filepath, FileAccessMode mode); wp_extern WpFile *fileOpen(const WpAllocator *allocator, WpStr8RO *filepath, WpFileAccessMode mode);
wapp_extern i64 _file_seek(WFile *file, i64 offset, FileSeekOrigin origin); wp_extern i64 fileSeek(WpFile *file, i64 offset, WpFileSeekOrigin origin);
wapp_extern u64 _file_read(void *dst_buf, u64 byte_count, WFile *file, u64 file_length); wp_extern u64 fileRead(void *dst_buf, u64 byte_count, WpFile *file, u64 file_length);
wapp_extern i64 _file_write(const void *src_buf, WFile *file, u64 byte_count); wp_extern i64 fileWrite(const void *src_buf, WpFile *file, u64 byte_count);
wapp_extern i32 _file_flush(WFile *file); wp_extern i32 fileFlush(WpFile *file);
wapp_extern i32 _file_close(WFile *file); wp_extern i32 fileClose(WpFile *file);
wapp_extern i32 _file_rename(Str8RO *old_filepath, Str8RO *new_filepath); wp_extern i32 fileRename(WpStr8RO *old_filepath, WpStr8RO *new_filepath);
wapp_extern i32 _file_remove(Str8RO *filepath); wp_extern i32 fileRemove(WpStr8RO *filepath);
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !FILE_H #endif // !FILE_H
+50 -50
View File
@@ -3,7 +3,7 @@
#include "file_posix.h" #include "file_posix.h"
#include "../../../common/platform/platform.h" #include "../../../common/platform/platform.h"
#ifdef WAPP_PLATFORM_POSIX #ifdef WP_PLATFORM_POSIX
#include "../file.h" #include "../file.h"
#include "../../cpath/cpath.h" #include "../../cpath/cpath.h"
@@ -11,62 +11,62 @@
#include "../../../base/array/array.h" #include "../../../base/array/array.h"
#include "../../../base/strings/str8/str8.h" #include "../../../base/strings/str8/str8.h"
#ifdef WAPP_PLATFORM_APPLE #ifdef WP_PLATFORM_APPLE
#define _FILE_OFFSET_BITS 64 #define _FILE_OFFSET_BITS 64
#define lseek64 lseek #define lseek64 lseek
#endif // !WAPP_PLATFORM_APPLE #endif // !WP_PLATFORM_APPLE
#define __USE_LARGEFILE64 #define __USE_LARGEFILE64
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#include <sys/types.h> #include <sys/types.h>
wapp_intern i32 file_flags[FILE_ACCESS_MODE_COUNT] = { wp_intern i32 file_flags[COUNT_FILE_ACCESS_MODE] = {
[WAPP_ACCESS_READ] = O_RDONLY, [WP_ACCESS_READ] = O_RDONLY,
[WAPP_ACCESS_WRITE] = O_WRONLY | O_CREAT, [WP_ACCESS_WRITE] = O_WRONLY | O_CREAT,
[WAPP_ACCESS_APPEND] = O_WRONLY | O_APPEND | O_CREAT, [WP_ACCESS_APPEND] = O_WRONLY | O_APPEND | O_CREAT,
[WAPP_ACCESS_READ_EX] = O_RDWR, [WP_ACCESS_READ_EX] = O_RDWR,
[WAPP_ACCESS_WRITE_EX] = O_RDWR | O_CREAT, [WP_ACCESS_WRITE_EX] = O_RDWR | O_CREAT,
[WAPP_ACCESS_APPEND_EX] = O_RDWR | O_APPEND | O_CREAT, [WP_ACCESS_APPEND_EX] = O_RDWR | O_APPEND | O_CREAT,
[WAPP_ACCESS_WRITE_FAIL_ON_EXIST] = O_WRONLY | O_CREAT | O_EXCL, [WP_ACCESS_WRITE_FAIL_ON_EXIST] = O_WRONLY | O_CREAT | O_EXCL,
[WAPP_ACCESS_WRITE_FAIL_ON_EXIST_EX] = O_RDWR | O_CREAT | O_EXCL, [WP_ACCESS_WRITE_FAIL_ON_EXIST_EX] = O_RDWR | O_CREAT | O_EXCL,
}; };
wapp_intern mode_t file_modes[FILE_ACCESS_MODE_COUNT] = { wp_intern mode_t file_modes[COUNT_FILE_ACCESS_MODE] = {
[WAPP_ACCESS_READ] = 0, [WP_ACCESS_READ] = 0,
[WAPP_ACCESS_WRITE] = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, [WP_ACCESS_WRITE] = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
[WAPP_ACCESS_APPEND] = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, [WP_ACCESS_APPEND] = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
[WAPP_ACCESS_READ_EX] = 0, [WP_ACCESS_READ_EX] = 0,
[WAPP_ACCESS_WRITE_EX] = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, [WP_ACCESS_WRITE_EX] = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
[WAPP_ACCESS_APPEND_EX] = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, [WP_ACCESS_APPEND_EX] = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
[WAPP_ACCESS_WRITE_FAIL_ON_EXIST] = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, [WP_ACCESS_WRITE_FAIL_ON_EXIST] = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
[WAPP_ACCESS_WRITE_FAIL_ON_EXIST_EX] = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, [WP_ACCESS_WRITE_FAIL_ON_EXIST_EX] = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
}; };
wapp_intern i32 file_seek_origins[FILE_SEEK_ORIGIN_COUNT] = { wp_intern i32 file_seek_origins[COUNT_FILE_SEEK_ORIGIN] = {
[WAPP_SEEK_START] = SEEK_SET, [WP_SEEK_START] = SEEK_SET,
[WAPP_SEEK_CURRENT] = SEEK_CUR, [WP_SEEK_CURRENT] = SEEK_CUR,
[WAPP_SEEK_END] = SEEK_END, [WP_SEEK_END] = SEEK_END,
}; };
WFile *wapp_file_stdin(void) { WpFile *wpFileStdin(void) {
wapp_persist WFile _stdin = { .fd = STDIN_FILENO }; wp_persist WpFile _stdin = { .fd = STDIN_FILENO };
return &_stdin; return &_stdin;
} }
WFile *wapp_file_stdout(void) { WpFile *wpFileStdout(void) {
wapp_persist WFile _stdout = { .fd = STDOUT_FILENO }; wp_persist WpFile _stdout = { .fd = STDOUT_FILENO };
return &_stdout; return &_stdout;
} }
WFile *wapp_file_stderr(void) { WpFile *wpFileStderr(void) {
wapp_persist WFile _stderr = { .fd = STDERR_FILENO }; wp_persist WpFile _stderr = { .fd = STDERR_FILENO };
return &_stderr; return &_stderr;
} }
WFile *_file_open(const Allocator *allocator, Str8RO *filepath, FileAccessMode mode) { WpFile *fileOpen(const WpAllocator *allocator, WpStr8RO *filepath, WpFileAccessMode mode) {
wapp_persist c8 tmp[WAPP_PATH_MAX] = {0}; wp_persist c8 tmp[WP_PATH_MAX] = {0};
memset(tmp, 0, WAPP_PATH_MAX); memset(tmp, 0, WP_PATH_MAX);
memcpy(tmp, filepath->buf, filepath->size); memcpy(tmp, filepath->buf, filepath->size);
i32 fd = open((const char *)tmp, file_flags[mode], file_modes[mode]); i32 fd = open((const char *)tmp, file_flags[mode], file_modes[mode]);
@@ -74,7 +74,7 @@ WFile *_file_open(const Allocator *allocator, Str8RO *filepath, FileAccessMode m
return NULL; return NULL;
} }
WFile *output = wapp_mem_allocator_alloc(allocator, sizeof(WFile)); WpFile *output = wpMemAllocatorAlloc(allocator, sizeof(WpFile));
if (output) { if (output) {
output->fd = fd; output->fd = fd;
} }
@@ -82,11 +82,11 @@ WFile *_file_open(const Allocator *allocator, Str8RO *filepath, FileAccessMode m
return output; return output;
} }
i64 _file_seek(WFile *file, i64 offset, FileSeekOrigin origin) { i64 fileSeek(WpFile *file, i64 offset, WpFileSeekOrigin origin) {
return lseek64(file->fd, offset, file_seek_origins[origin]); return lseek64(file->fd, offset, file_seek_origins[origin]);
} }
u64 _file_read(void *dst_buf, u64 byte_count, WFile *file, u64 file_length) { u64 fileRead(void *dst_buf, u64 byte_count, WpFile *file, u64 file_length) {
u64 copy_byte_count = file_length <= byte_count ? file_length : byte_count; u64 copy_byte_count = file_length <= byte_count ? file_length : byte_count;
i64 count = read(file->fd, dst_buf, copy_byte_count); i64 count = read(file->fd, dst_buf, copy_byte_count);
@@ -95,40 +95,40 @@ u64 _file_read(void *dst_buf, u64 byte_count, WFile *file, u64 file_length) {
return count; return count;
} }
i64 _file_write(const void *src_buf, WFile *file, u64 byte_count) { i64 fileWrite(const void *src_buf, WpFile *file, u64 byte_count) {
return write(file->fd, src_buf, byte_count); return write(file->fd, src_buf, byte_count);
} }
i32 _file_flush(WFile *file) { i32 fileFlush(WpFile *file) {
return fsync(file->fd); return fsync(file->fd);
} }
i32 _file_close(WFile *file) { i32 fileClose(WpFile *file) {
return close(file->fd); return close(file->fd);
} }
i32 _file_rename(Str8RO *old_filepath, Str8RO *new_filepath) { i32 fileRename(WpStr8RO *old_filepath, WpStr8RO *new_filepath) {
wapp_persist c8 old_tmp[WAPP_PATH_MAX] = {0}; wp_persist c8 old_tmp[WP_PATH_MAX] = {0};
wapp_persist c8 new_tmp[WAPP_PATH_MAX] = {0}; wp_persist c8 new_tmp[WP_PATH_MAX] = {0};
memset(old_tmp, 0, WAPP_PATH_MAX); memset(old_tmp, 0, WP_PATH_MAX);
memcpy(old_tmp, old_filepath->buf, old_filepath->size); memcpy(old_tmp, old_filepath->buf, old_filepath->size);
memset(new_tmp, 0, WAPP_PATH_MAX); memset(new_tmp, 0, WP_PATH_MAX);
memcpy(new_tmp, new_filepath->buf, new_filepath->size); memcpy(new_tmp, new_filepath->buf, new_filepath->size);
i32 link_result = link((const char *)old_tmp, (const char *)new_tmp); i32 link_result = link((const char *)old_tmp, (const char *)new_tmp);
if (link_result == 0) { if (link_result == 0) {
_file_remove(old_filepath); fileRemove(old_filepath);
} }
return link_result; return link_result;
} }
i32 _file_remove(Str8RO *filepath) { i32 fileRemove(WpStr8RO *filepath) {
wapp_persist c8 tmp[WAPP_PATH_MAX] = {0}; wp_persist c8 tmp[WP_PATH_MAX] = {0};
memset(tmp, 0, WAPP_PATH_MAX); memset(tmp, 0, WP_PATH_MAX);
memcpy(tmp, filepath->buf, filepath->size); memcpy(tmp, filepath->buf, filepath->size);
return unlink((const char *)tmp); return unlink((const char *)tmp);
} }
#endif // !WAPP_PLATFORM_POSIX #endif // !WP_PLATFORM_POSIX
+8 -8
View File
@@ -6,22 +6,22 @@
#include "../../../common/aliases/aliases.h" #include "../../../common/aliases/aliases.h"
#include "../../../common/platform/platform.h" #include "../../../common/platform/platform.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#ifdef WAPP_PLATFORM_POSIX #ifdef WP_PLATFORM_POSIX
#define END_OF_LINE "\n" #define WP_END_OF_LINE "\n"
struct WFile { struct WpFile {
i32 fd; i32 fd;
}; };
#endif // !WAPP_PLATFORM_POSIX #endif // !WP_PLATFORM_POSIX
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !FILE_POSIX_H #endif // !FILE_POSIX_H
+58 -58
View File
@@ -3,7 +3,7 @@
#include "file_win.h" #include "file_win.h"
#include "../../../common/platform/platform.h" #include "../../../common/platform/platform.h"
#ifdef WAPP_PLATFORM_WINDOWS #ifdef WP_PLATFORM_WINDOWS
#include "../file.h" #include "../file.h"
#include "../../cpath/cpath.h" #include "../../cpath/cpath.h"
@@ -15,66 +15,66 @@
#include <fileapi.h> #include <fileapi.h>
#include <intsafe.h> #include <intsafe.h>
wapp_intern DWORD file_accesses[FILE_ACCESS_MODE_COUNT] = { wp_intern DWORD file_accesses[COUNT_FILE_ACCESS_MODE] = {
[WAPP_ACCESS_READ] = FILE_READ_DATA, [WP_ACCESS_READ] = FILE_READ_DATA,
[WAPP_ACCESS_WRITE] = FILE_WRITE_DATA, [WP_ACCESS_WRITE] = FILE_WRITE_DATA,
[WAPP_ACCESS_APPEND] = FILE_APPEND_DATA, [WP_ACCESS_APPEND] = FILE_APPEND_DATA,
[WAPP_ACCESS_READ_EX] = FILE_READ_DATA | FILE_WRITE_DATA, [WP_ACCESS_READ_EX] = FILE_READ_DATA | FILE_WRITE_DATA,
[WAPP_ACCESS_WRITE_EX] = FILE_READ_DATA | FILE_WRITE_DATA, [WP_ACCESS_WRITE_EX] = FILE_READ_DATA | FILE_WRITE_DATA,
[WAPP_ACCESS_APPEND_EX] = FILE_READ_DATA | FILE_APPEND_DATA, [WP_ACCESS_APPEND_EX] = FILE_READ_DATA | FILE_APPEND_DATA,
[WAPP_ACCESS_WRITE_FAIL_ON_EXIST] = FILE_WRITE_DATA, [WP_ACCESS_WRITE_FAIL_ON_EXIST] = FILE_WRITE_DATA,
[WAPP_ACCESS_WRITE_FAIL_ON_EXIST_EX] = FILE_READ_DATA | FILE_WRITE_DATA, [WP_ACCESS_WRITE_FAIL_ON_EXIST_EX] = FILE_READ_DATA | FILE_WRITE_DATA,
}; };
wapp_intern DWORD creation_dispositions[FILE_ACCESS_MODE_COUNT] = { wp_intern DWORD creation_dispositions[COUNT_FILE_ACCESS_MODE] = {
[WAPP_ACCESS_READ] = OPEN_EXISTING, [WP_ACCESS_READ] = OPEN_EXISTING,
[WAPP_ACCESS_WRITE] = CREATE_ALWAYS, [WP_ACCESS_WRITE] = CREATE_ALWAYS,
[WAPP_ACCESS_APPEND] = OPEN_ALWAYS, [WP_ACCESS_APPEND] = OPEN_ALWAYS,
[WAPP_ACCESS_READ_EX] = OPEN_EXISTING, [WP_ACCESS_READ_EX] = OPEN_EXISTING,
[WAPP_ACCESS_WRITE_EX] = CREATE_ALWAYS, [WP_ACCESS_WRITE_EX] = CREATE_ALWAYS,
[WAPP_ACCESS_APPEND_EX] = OPEN_ALWAYS, [WP_ACCESS_APPEND_EX] = OPEN_ALWAYS,
[WAPP_ACCESS_WRITE_FAIL_ON_EXIST] = CREATE_NEW, [WP_ACCESS_WRITE_FAIL_ON_EXIST] = CREATE_NEW,
[WAPP_ACCESS_WRITE_FAIL_ON_EXIST_EX] = CREATE_NEW, [WP_ACCESS_WRITE_FAIL_ON_EXIST_EX] = CREATE_NEW,
}; };
wapp_intern DWORD sharing_modes[FILE_ACCESS_MODE_COUNT] = { wp_intern DWORD sharing_modes[COUNT_FILE_ACCESS_MODE] = {
[WAPP_ACCESS_READ] = FILE_SHARE_READ | FILE_SHARE_WRITE, [WP_ACCESS_READ] = FILE_SHARE_READ | FILE_SHARE_WRITE,
[WAPP_ACCESS_WRITE] = FILE_SHARE_READ, [WP_ACCESS_WRITE] = FILE_SHARE_READ,
[WAPP_ACCESS_APPEND] = FILE_SHARE_READ, [WP_ACCESS_APPEND] = FILE_SHARE_READ,
[WAPP_ACCESS_READ_EX] = FILE_SHARE_READ | FILE_SHARE_WRITE, [WP_ACCESS_READ_EX] = FILE_SHARE_READ | FILE_SHARE_WRITE,
[WAPP_ACCESS_WRITE_EX] = FILE_SHARE_READ, [WP_ACCESS_WRITE_EX] = FILE_SHARE_READ,
[WAPP_ACCESS_APPEND_EX] = FILE_SHARE_READ, [WP_ACCESS_APPEND_EX] = FILE_SHARE_READ,
[WAPP_ACCESS_WRITE_FAIL_ON_EXIST] = FILE_SHARE_READ, [WP_ACCESS_WRITE_FAIL_ON_EXIST] = FILE_SHARE_READ,
[WAPP_ACCESS_WRITE_FAIL_ON_EXIST_EX] = FILE_SHARE_READ, [WP_ACCESS_WRITE_FAIL_ON_EXIST_EX] = FILE_SHARE_READ,
}; };
wapp_intern DWORD file_seek_origins[FILE_SEEK_ORIGIN_COUNT] = { wp_intern DWORD file_seek_origins[COUNT_FILE_SEEK_ORIGIN] = {
[WAPP_SEEK_START] = FILE_BEGIN, [WP_SEEK_START] = FILE_BEGIN,
[WAPP_SEEK_CURRENT] = FILE_CURRENT, [WP_SEEK_CURRENT] = FILE_CURRENT,
[WAPP_SEEK_END] = FILE_END, [WP_SEEK_END] = FILE_END,
}; };
WFile *wapp_file_stdin(void) { WpFile *wpFileStdin(void) {
wapp_persist WFile _stdin = { .fh = INVALID_HANDLE_VALUE }; wp_persist WpFile _stdin = { .fh = INVALID_HANDLE_VALUE };
_stdin.fh = GetStdHandle(STD_INPUT_HANDLE); _stdin.fh = GetStdHandle(STD_INPUT_HANDLE);
return &_stdin; return &_stdin;
} }
WFile *wapp_file_stdout(void) { WpFile *wpFileStdout(void) {
wapp_persist WFile _stdout = { .fh = INVALID_HANDLE_VALUE }; wp_persist WpFile _stdout = { .fh = INVALID_HANDLE_VALUE };
_stdout.fh = GetStdHandle(STD_OUTPUT_HANDLE); _stdout.fh = GetStdHandle(STD_OUTPUT_HANDLE);
return &_stdout; return &_stdout;
} }
WFile *wapp_file_stderr(void) { WpFile *wpFileStderr(void) {
wapp_persist WFile _stderr = { .fh = INVALID_HANDLE_VALUE }; wp_persist WpFile _stderr = { .fh = INVALID_HANDLE_VALUE };
_stderr.fh = GetStdHandle(STD_ERROR_HANDLE); _stderr.fh = GetStdHandle(STD_ERROR_HANDLE);
return &_stderr; return &_stderr;
} }
WFile *_file_open(const Allocator *allocator, Str8RO *filepath, FileAccessMode mode) { WpFile *fileOpen(const WpAllocator *allocator, WpStr8RO *filepath, WpFileAccessMode mode) {
wapp_persist c8 tmp[WAPP_PATH_MAX] = {0}; wp_persist c8 tmp[WP_PATH_MAX] = {0};
memset(tmp, 0, WAPP_PATH_MAX); memset(tmp, 0, WP_PATH_MAX);
memcpy(tmp, filepath->buf, filepath->size); memcpy(tmp, filepath->buf, filepath->size);
HANDLE fh = CreateFileA((LPCSTR)tmp, HANDLE fh = CreateFileA((LPCSTR)tmp,
@@ -88,7 +88,7 @@ WFile *_file_open(const Allocator *allocator, Str8RO *filepath, FileAccessMode m
return NULL; return NULL;
} }
WFile *output = wapp_mem_allocator_alloc(allocator, sizeof(WFile)); WpFile *output = wpMemAllocatorAlloc(allocator, sizeof(WpFile));
if (output) { if (output) {
output->fh = fh; output->fh = fh;
} }
@@ -96,7 +96,7 @@ WFile *_file_open(const Allocator *allocator, Str8RO *filepath, FileAccessMode m
return output; return output;
} }
i64 _file_seek(WFile *file, i64 offset, FileSeekOrigin origin) { i64 fileSeek(WpFile *file, i64 offset, WpFileSeekOrigin origin) {
LARGE_INTEGER distance = {0}; LARGE_INTEGER distance = {0};
LARGE_INTEGER output = {0}; LARGE_INTEGER output = {0};
@@ -109,9 +109,9 @@ i64 _file_seek(WFile *file, i64 offset, FileSeekOrigin origin) {
return output.QuadPart; return output.QuadPart;
} }
u64 _file_read(void* dst_buf, u64 byte_count, WFile* file, u64 file_length) { u64 fileRead(void* dst_buf, u64 byte_count, WpFile* file, u64 file_length) {
u64 copy_byte_count = file_length <= byte_count ? file_length : byte_count; u64 copy_byte_count = file_length <= byte_count ? file_length : byte_count;
wapp_debug_assert(copy_byte_count <= DWORD_MAX, "Attempting to read large number of bytes at once"); wpDebugAssert(copy_byte_count <= DWORD_MAX, "Attempting to read large number of bytes at once");
DWORD read_count = 0; DWORD read_count = 0;
if (!ReadFile(file->fh, dst_buf, (DWORD)copy_byte_count, &read_count, NULL)) { if (!ReadFile(file->fh, dst_buf, (DWORD)copy_byte_count, &read_count, NULL)) {
@@ -121,8 +121,8 @@ u64 _file_read(void* dst_buf, u64 byte_count, WFile* file, u64 file_length) {
return (u64)read_count; return (u64)read_count;
} }
i64 _file_write(const void *src_buf, WFile *file, u64 byte_count) { i64 fileWrite(const void *src_buf, WpFile *file, u64 byte_count) {
wapp_debug_assert(byte_count <= DWORD_MAX, "Attempting to write large number of bytes at once"); wpDebugAssert(byte_count <= DWORD_MAX, "Attempting to write large number of bytes at once");
DWORD write_count = 0; DWORD write_count = 0;
if (!WriteFile(file->fh, src_buf, (DWORD)byte_count, &write_count, NULL)) { if (!WriteFile(file->fh, src_buf, (DWORD)byte_count, &write_count, NULL)) {
@@ -131,7 +131,7 @@ i64 _file_write(const void *src_buf, WFile *file, u64 byte_count) {
return (i64)write_count; return (i64)write_count;
} }
i32 _file_flush(WFile *file) { i32 fileFlush(WpFile *file) {
if (!FlushFileBuffers(file->fh)) { if (!FlushFileBuffers(file->fh)) {
return -1; return -1;
} }
@@ -139,7 +139,7 @@ i32 _file_flush(WFile *file) {
return 0; return 0;
} }
i32 _file_close(WFile *file) { i32 fileClose(WpFile *file) {
if (!CloseHandle(file->fh)) { if (!CloseHandle(file->fh)) {
return -1; return -1;
} }
@@ -147,12 +147,12 @@ i32 _file_close(WFile *file) {
return 0; return 0;
} }
i32 _file_rename(Str8RO *old_filepath, Str8RO *new_filepath) { i32 fileRename(WpStr8RO *old_filepath, WpStr8RO *new_filepath) {
wapp_persist c8 old_tmp[WAPP_PATH_MAX] = {0}; wp_persist c8 old_tmp[WP_PATH_MAX] = {0};
wapp_persist c8 new_tmp[WAPP_PATH_MAX] = {0}; wp_persist c8 new_tmp[WP_PATH_MAX] = {0};
memset(old_tmp, 0, WAPP_PATH_MAX); memset(old_tmp, 0, WP_PATH_MAX);
memcpy(old_tmp, old_filepath->buf, old_filepath->size); memcpy(old_tmp, old_filepath->buf, old_filepath->size);
memset(new_tmp, 0, WAPP_PATH_MAX); memset(new_tmp, 0, WP_PATH_MAX);
memcpy(new_tmp, new_filepath->buf, new_filepath->size); memcpy(new_tmp, new_filepath->buf, new_filepath->size);
if (!MoveFile((LPCSTR)old_tmp, (LPCSTR)new_tmp)) { if (!MoveFile((LPCSTR)old_tmp, (LPCSTR)new_tmp)) {
@@ -162,9 +162,9 @@ i32 _file_rename(Str8RO *old_filepath, Str8RO *new_filepath) {
return 0; return 0;
} }
i32 _file_remove(Str8RO *filepath) { i32 fileRemove(WpStr8RO *filepath) {
wapp_persist c8 tmp[WAPP_PATH_MAX] = {0}; wp_persist c8 tmp[WP_PATH_MAX] = {0};
memset(tmp, 0, WAPP_PATH_MAX); memset(tmp, 0, WP_PATH_MAX);
memcpy(tmp, filepath->buf, filepath->size); memcpy(tmp, filepath->buf, filepath->size);
if (!DeleteFile((LPCSTR)tmp)) { if (!DeleteFile((LPCSTR)tmp)) {
@@ -174,4 +174,4 @@ i32 _file_remove(Str8RO *filepath) {
return 0; return 0;
} }
#endif // !WAPP_PLATFORM_WINDOWS #endif // !WP_PLATFORM_WINDOWS
+8 -8
View File
@@ -6,26 +6,26 @@
#include "../../../common/aliases/aliases.h" #include "../../../common/aliases/aliases.h"
#include "../../../common/platform/platform.h" #include "../../../common/platform/platform.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#ifdef WAPP_PLATFORM_WINDOWS #ifdef WP_PLATFORM_WINDOWS
#define END_OF_LINE "\r\n" #define WP_END_OF_LINE "\r\n"
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <Windows.h> #include <Windows.h>
#include <fileapi.h> #include <fileapi.h>
struct WFile { struct WpFile {
HANDLE fh; HANDLE fh;
}; };
#endif // !WAPP_PLATFORM_WINDOWS #endif // !WP_PLATFORM_WINDOWS
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !FILE_WIN_H #endif // !FILE_WIN_H
+7 -7
View File
@@ -7,24 +7,24 @@
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>
#if defined(WAPP_PLATFORM_WINDOWS) #if defined(WP_PLATFORM_WINDOWS)
#include "win/mem_os_win.h" #include "win/mem_os_win.h"
#elif defined(WAPP_PLATFORM_POSIX) #elif defined(WP_PLATFORM_POSIX)
#include "posix/mem_os_posix.h" #include "posix/mem_os_posix.h"
#else #else
#error "Unrecognised platform" #error "Unrecognised platform"
#endif #endif
void *wapp_os_mem_alloc(void *addr, u64 size, MemAccess access, MemAllocFlags flags, MemInitType type) { void *wpOsMemAlloc(void *addr, u64 size, WpMemAccess access, WpMemAllocFlags flags, WpMemInitType type) {
void *output = os_mem_allocate(addr, size, access, flags, type); void *output = osMemAllocate(addr, size, access, flags, type);
if (type == WAPP_MEM_INIT_INITIALISED) { if (type == WP_MEM_INIT_INITIALISED) {
memset(output, 0, size); memset(output, 0, size);
} }
return output; return output;
} }
void wapp_os_mem_free(void *ptr, u64 size) { void wpOsMemFree(void *ptr, u64 size) {
os_mem_free(ptr, size); osMemFree(ptr, size);
} }
+10 -10
View File
@@ -8,26 +8,26 @@
#include "mem_os_ops.h" #include "mem_os_ops.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#if defined(WAPP_PLATFORM_WINDOWS) #if defined(WP_PLATFORM_WINDOWS)
#include "win/mem_os_win.h" #include "win/mem_os_win.h"
#elif defined(WAPP_PLATFORM_POSIX) #elif defined(WP_PLATFORM_POSIX)
#include "posix/mem_os_posix.h" #include "posix/mem_os_posix.h"
#else #else
#error "Unrecognised platform" #error "Unrecognised platform"
#endif #endif
void *wapp_os_mem_alloc(void *addr, u64 size, MemAccess access, MemAllocFlags flags, MemInitType type); void *wpOsMemAlloc(void *addr, u64 size, WpMemAccess access, WpMemAllocFlags flags, WpMemInitType type);
void wapp_os_mem_free(void *ptr, u64 size); void wpOsMemFree(void *ptr, u64 size);
wapp_extern void *os_mem_allocate(void *addr, u64 size, MemAccess access, MemAllocFlags flags, MemInitType type); wp_extern void *osMemAllocate(void *addr, u64 size, WpMemAccess access, WpMemAllocFlags flags, WpMemInitType type);
wapp_extern void os_mem_free(void *ptr, u64 size); wp_extern void osMemFree(void *ptr, u64 size);
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !MEM_OS_H #endif // !MEM_OS_H
+16 -16
View File
@@ -5,26 +5,26 @@
#include "../../common/platform/platform.h" #include "../../common/platform/platform.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
typedef enum mem_access { typedef enum WpMemAccess {
WAPP_MEM_ACCESS_NONE, WP_MEM_ACCESS_NONE,
WAPP_MEM_ACCESS_READ_ONLY, WP_MEM_ACCESS_READ_ONLY,
WAPP_MEM_ACCESS_EXEC_ONLY, WP_MEM_ACCESS_EXEC_ONLY,
WAPP_MEM_ACCESS_READ_WRITE, WP_MEM_ACCESS_READ_WRITE,
WAPP_MEM_ACCESS_READ_EXEC, WP_MEM_ACCESS_READ_EXEC,
WAPP_MEM_ACCESS_READ_WRITE_EXEC, WP_MEM_ACCESS_READ_WRITE_EXEC,
} MemAccess; } WpMemAccess;
typedef enum mem_init_type { typedef enum WpMemInitType {
WAPP_MEM_INIT_UNINITIALISED, WP_MEM_INIT_UNINITIALISED,
WAPP_MEM_INIT_INITIALISED, WP_MEM_INIT_INITIALISED,
} MemInitType; } WpMemInitType;
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !MEM_OS_OPS_H #endif // !MEM_OS_OPS_H
+12 -12
View File
@@ -3,34 +3,34 @@
#include "../../../common/aliases/aliases.h" #include "../../../common/aliases/aliases.h"
#include "../../../common/platform/platform.h" #include "../../../common/platform/platform.h"
#ifdef WAPP_PLATFORM_POSIX #ifdef WP_PLATFORM_POSIX
#include "mem_os_posix.h" #include "mem_os_posix.h"
#include "../mem_os_ops.h" #include "../mem_os_ops.h"
#include <sys/mman.h> #include <sys/mman.h>
wapp_intern const i32 access_types[] = { wp_intern const i32 access_types[] = {
[WAPP_MEM_ACCESS_NONE] = PROT_NONE, [WP_MEM_ACCESS_NONE] = PROT_NONE,
[WAPP_MEM_ACCESS_READ_ONLY] = PROT_READ, [WP_MEM_ACCESS_READ_ONLY] = PROT_READ,
[WAPP_MEM_ACCESS_EXEC_ONLY] = PROT_EXEC, [WP_MEM_ACCESS_EXEC_ONLY] = PROT_EXEC,
[WAPP_MEM_ACCESS_READ_WRITE] = PROT_READ | PROT_WRITE, [WP_MEM_ACCESS_READ_WRITE] = PROT_READ | PROT_WRITE,
[WAPP_MEM_ACCESS_READ_EXEC] = PROT_READ | PROT_EXEC, [WP_MEM_ACCESS_READ_EXEC] = PROT_READ | PROT_EXEC,
[WAPP_MEM_ACCESS_READ_WRITE_EXEC] = PROT_READ | PROT_WRITE | PROT_EXEC, [WP_MEM_ACCESS_READ_WRITE_EXEC] = PROT_READ | PROT_WRITE | PROT_EXEC,
}; };
void *os_mem_allocate(void *addr, u64 size, MemAccess access, MemAllocFlags flags, MemInitType type) { void *osMemAllocate(void *addr, u64 size, WpMemAccess access, WpMemAllocFlags flags, WpMemInitType type) {
(void)type; (void)type;
i32 alloc_flags = flags | MAP_ANON | MAP_PRIVATE; i32 alloc_flags = flags | MAP_ANON | MAP_PRIVATE;
#if defined(WAPP_PLATFORM_LINUX) || defined(WAPP_PLATFORM_GNU) || defined(WAPP_PLATFORM_NET_BSD) #if defined(WP_PLATFORM_LINUX) || defined(WP_PLATFORM_GNU) || defined(WP_PLATFORM_NET_BSD)
alloc_flags |= MAP_NORESERVE; alloc_flags |= MAP_NORESERVE;
#endif #endif
return mmap(addr, size, access_types[access], alloc_flags, -1, 0); return mmap(addr, size, access_types[access], alloc_flags, -1, 0);
} }
void os_mem_free(void *ptr, u64 size) { void osMemFree(void *ptr, u64 size) {
munmap(ptr, size); munmap(ptr, size);
} }
#endif // !WAPP_PLATFORM_POSIX #endif // !WP_PLATFORM_POSIX
+17 -17
View File
@@ -5,31 +5,31 @@
#include "../../../common/platform/platform.h" #include "../../../common/platform/platform.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#ifdef WAPP_PLATFORM_POSIX #ifdef WP_PLATFORM_POSIX
#include <sys/mman.h> #include <sys/mman.h>
typedef enum mem_alloc_flags { typedef enum WpMemAllocFlags {
#if defined(WAPP_PLATFORM_LINUX) || defined(WAPP_PLATFORM_GNU) #if defined(WP_PLATFORM_LINUX) || defined(WP_PLATFORM_GNU)
WAPP_MEM_ALLOC_RESERVE = 0, WP_MEM_ALLOC_RESERVE = 0,
WAPP_MEM_ALLOC_COMMIT = MAP_POPULATE, WP_MEM_ALLOC_COMMIT = MAP_POPULATE,
#elif defined(WAPP_PLATFORM_FREE_BSD) #elif defined(WP_PLATFORM_FREE_BSD)
WAPP_MEM_ALLOC_RESERVE = 0, WP_MEM_ALLOC_RESERVE = 0,
WAPP_MEM_ALLOC_COMMIT = MAP_PREFAULT_READ, WP_MEM_ALLOC_COMMIT = MAP_PREFAULT_READ,
#elif defined(WAPP_PLATFORM_BSD) || defined(WAPP_PLATFORM_UNIX) || defined(WAPP_PLATFORM_APPLE) #elif defined(WP_PLATFORM_BSD) || defined(WP_PLATFORM_UNIX) || defined(WP_PLATFORM_APPLE)
WAPP_MEM_ALLOC_RESERVE = 0, WP_MEM_ALLOC_RESERVE = 0,
WAPP_MEM_ALLOC_COMMIT = 0, WP_MEM_ALLOC_COMMIT = 0,
#endif #endif
} MemAllocFlags; } WpMemAllocFlags;
#endif // !WAPP_PLATFORM_POSIX #endif // !WP_PLATFORM_POSIX
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !MEM_OS_POSIX_H #endif // !MEM_OS_POSIX_H
+13 -13
View File
@@ -3,7 +3,7 @@
#include "../../../common/aliases/aliases.h" #include "../../../common/aliases/aliases.h"
#include "../../../common/platform/platform.h" #include "../../../common/platform/platform.h"
#ifdef WAPP_PLATFORM_WINDOWS #ifdef WP_PLATFORM_WINDOWS
#include "mem_os_win.h" #include "mem_os_win.h"
#include "../mem_os_ops.h" #include "../mem_os_ops.h"
@@ -12,26 +12,26 @@
#include <Windows.h> #include <Windows.h>
#include <memoryapi.h> #include <memoryapi.h>
wapp_intern const i32 access_types[] = { wp_intern const i32 access_types[] = {
[WAPP_MEM_ACCESS_NONE] = PAGE_NOACCESS, [WP_MEM_ACCESS_NONE] = PAGE_NOACCESS,
[WAPP_MEM_ACCESS_READ_ONLY] = PAGE_READONLY, [WP_MEM_ACCESS_READ_ONLY] = PAGE_READONLY,
[WAPP_MEM_ACCESS_EXEC_ONLY] = PAGE_EXECUTE, [WP_MEM_ACCESS_EXEC_ONLY] = PAGE_EXECUTE,
[WAPP_MEM_ACCESS_READ_WRITE] = PAGE_READWRITE, [WP_MEM_ACCESS_READ_WRITE] = PAGE_READWRITE,
[WAPP_MEM_ACCESS_READ_EXEC] = PAGE_EXECUTE_READ, [WP_MEM_ACCESS_READ_EXEC] = PAGE_EXECUTE_READ,
[WAPP_MEM_ACCESS_READ_WRITE_EXEC] = PAGE_EXECUTE_READWRITE, [WP_MEM_ACCESS_READ_WRITE_EXEC] = PAGE_EXECUTE_READWRITE,
}; };
void *os_mem_allocate(void *addr, u64 size, MemAccess access, MemAllocFlags flags, MemInitType type) { void *osMemAllocate(void *addr, u64 size, WpMemAccess access, WpMemAllocFlags flags, WpMemInitType type) {
// Ensure memory is committed if it's meant to be initialised // Ensure memory is committed if it's meant to be initialised
if (type == WAPP_MEM_INIT_INITIALISED) { if (type == WP_MEM_INIT_INITIALISED) {
flags |= WAPP_MEM_ALLOC_COMMIT; flags |= WP_MEM_ALLOC_COMMIT;
} }
return VirtualAlloc(addr, (SIZE_T)size, flags, access_types[access]); return VirtualAlloc(addr, (SIZE_T)size, flags, access_types[access]);
} }
void os_mem_free(void *ptr, u64 size) { void osMemFree(void *ptr, u64 size) {
VirtualFree(ptr, size, MEM_RELEASE); VirtualFree(ptr, size, MEM_RELEASE);
} }
#endif // !WAPP_PLATFORM_WINDOWS #endif // !WP_PLATFORM_WINDOWS
+10 -10
View File
@@ -5,25 +5,25 @@
#include "../../../common/platform/platform.h" #include "../../../common/platform/platform.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#ifdef WAPP_PLATFORM_WINDOWS #ifdef WP_PLATFORM_WINDOWS
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <Windows.h> #include <Windows.h>
#include <memoryapi.h> #include <memoryapi.h>
typedef enum mem_alloc_flags { typedef enum WpMemAllocFlags {
WAPP_MEM_ALLOC_RESERVE = MEM_RESERVE, WP_MEM_ALLOC_RESERVE = MEM_RESERVE,
WAPP_MEM_ALLOC_COMMIT = MEM_COMMIT, WP_MEM_ALLOC_COMMIT = MEM_COMMIT,
} MemAllocFlags; } WpMemAllocFlags;
#endif // !WAPP_PLATFORM_WINDOWS #endif // !WP_PLATFORM_WINDOWS
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !MEM_OS_WIN_H #endif // !MEM_OS_WIN_H
+37 -37
View File
@@ -17,85 +17,85 @@
#define CMD_BUF_LEN 8192 #define CMD_BUF_LEN 8192
#define OUT_BUF_LEN 4096 #define OUT_BUF_LEN 4096
wapp_intern CMDResult execute_command(Str8RO *cmd, CMDOutHandling out_handling, Str8 *out_buf); wp_intern WpCmdResult executeCommand(WpStr8RO *cmd, WpCmdOutHandling out_handling, WpStr8 *out_buf);
wapp_intern CMDError get_command_output(FILE *fp, CMDOutHandling out_handling, Str8 *out_buf); wp_intern WpCmdError getCommandOutput(FILE *fp, WpCmdOutHandling out_handling, WpStr8 *out_buf);
CMDResult wapp_shell_commander_execute(CMDOutHandling out_handling, Str8 *out_buf, const Str8List *cmd) { WpCmdResult wpShellCommanderExecute(WpCmdOutHandling out_handling, WpStr8 *out_buf, const WpStr8List *cmd) {
if (!cmd) { if (!cmd) {
return CMD_NO_EXIT(SHELL_ERR_INVALID_ARGS); return wpCmdNoExit(WP_SHELL_ERR_INVALID_ARGS);
} }
Allocator arena = wapp_mem_arena_allocator_init(KiB(500)); WpAllocator arena = wpMemArenaAllocatorInit(KiB(500));
Str8 *cmd_str = wapp_str8_join(&arena, cmd, &wapp_str8_lit_ro(" ")); WpStr8 *cmd_str = wpStr8Join(&arena, cmd, &wpStr8LitRo(" "));
if (!cmd_str) { if (!cmd_str) {
wapp_mem_arena_allocator_destroy(&arena); wpMemArenaAllocatorDestroy(&arena);
return CMD_NO_EXIT(SHELL_ERR_ALLOCATION_FAIL); return wpCmdNoExit(WP_SHELL_ERR_ALLOCATION_FAIL);
} }
// Redirect output // Redirect output
cmd_str = wapp_str8_alloc_concat(&arena, cmd_str, &wapp_str8_lit_ro(" 2>&1")); cmd_str = wpStr8AllocConcat(&arena, cmd_str, &wpStr8LitRo(" 2>&1"));
CMDResult output = execute_command(cmd_str, out_handling, out_buf); WpCmdResult output = executeCommand(cmd_str, out_handling, out_buf);
wapp_mem_arena_allocator_destroy(&arena); wpMemArenaAllocatorDestroy(&arena);
return output; return output;
} }
wapp_intern CMDResult execute_command(Str8RO *cmd, CMDOutHandling out_handling, Str8 *out_buf) { wp_intern WpCmdResult executeCommand(WpStr8RO *cmd, WpCmdOutHandling out_handling, WpStr8 *out_buf) {
char cmd_buf[CMD_BUF_LEN] = {0}; char cmd_buf[CMD_BUF_LEN] = {0};
wapp_str8_copy_to_cstr(cmd_buf, cmd, CMD_BUF_LEN); wpStr8CopyToCstr(cmd_buf, cmd, CMD_BUF_LEN);
FILE *fp = wapp_shell_utils_popen(cmd_buf, "r"); FILE *fp = wpShellUtilsPopen(cmd_buf, "r");
if (!fp) { if (!fp) {
return CMD_NO_EXIT(SHELL_ERR_PROC_START_FAIL); return wpCmdNoExit(WP_SHELL_ERR_PROC_START_FAIL);
} }
CMDResult output; WpCmdResult output;
CMDError err = get_command_output(fp, out_handling, out_buf); WpCmdError err = getCommandOutput(fp, out_handling, out_buf);
if (err > SHELL_ERR_NO_ERROR) { if (err > WP_SHELL_ERR_NO_ERROR) {
output = CMD_NO_EXIT(err); output = wpCmdNoExit(err);
goto EXECUTE_COMMAND_CLOSE; goto executeCommand_CLOSE;
} }
i32 st = EXIT_SUCCESS; i32 st = EXIT_SUCCESS;
err = get_output_status(fp, &st); err = getOutputStatus(fp, &st);
if (err > SHELL_ERR_NO_ERROR) { if (err > WP_SHELL_ERR_NO_ERROR) {
output = CMD_NO_EXIT(err); output = wpCmdNoExit(err);
goto EXECUTE_COMMAND_CLOSE; goto executeCommand_CLOSE;
} }
// Process is already closed in get_output_status // Process is already closed in _getOutputStatus
fp = NULL; fp = NULL;
output = (CMDResult){ output = (WpCmdResult){
.exited = true, .exited = true,
.exit_code = st, .exit_code = st,
.error = SHELL_ERR_NO_ERROR, .error = WP_SHELL_ERR_NO_ERROR,
}; };
EXECUTE_COMMAND_CLOSE: executeCommand_CLOSE:
if (fp) { if (fp) {
wapp_shell_utils_pclose(fp); wpShellUtilsPclose(fp);
} }
return output; return output;
} }
wapp_intern CMDError get_command_output(FILE *fp, CMDOutHandling out_handling, Str8 *out_buf) { wp_intern WpCmdError getCommandOutput(FILE *fp, WpCmdOutHandling out_handling, WpStr8 *out_buf) {
Str8 out = wapp_str8_buf(OUT_BUF_LEN); WpStr8 out = wpStr8Buf(OUT_BUF_LEN);
out.size = fread((void *)out.buf, sizeof(c8), out.capacity, fp); out.size = fread((void *)out.buf, sizeof(c8), out.capacity, fp);
if (out_handling == SHELL_OUTPUT_CAPTURE && out_buf != NULL) { if (out_handling == WP_SHELL_OUTPUT_CAPTURE && out_buf != NULL) {
if (out.size >= out_buf->capacity) { if (out.size >= out_buf->capacity) {
return SHELL_ERR_OUT_BUF_FULL; return WP_SHELL_ERR_OUT_BUF_FULL;
} }
wapp_str8_concat_capped(out_buf, &out); wpStr8ConcatCapped(out_buf, &out);
} else if (out_handling == SHELL_OUTPUT_PRINT) { } else if (out_handling == WP_SHELL_OUTPUT_PRINT) {
printf(WAPP_STR8_SPEC, wapp_str8_varg(out)); printf("%" WP_STR8_SPEC, wpStr8Varg(out));
} }
return SHELL_ERR_NO_ERROR; return WP_SHELL_ERR_NO_ERROR;
} }
+7 -7
View File
@@ -12,18 +12,18 @@
// TODO (Abdelrahman): This module needs rethinking // TODO (Abdelrahman): This module needs rethinking
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#define CMD_NO_EXIT(ERR) ((CMDResult){.exited = false, .exit_code = EXIT_FAILURE, .error = ERR}) #define wpCmdNoExit(ERR) ((WpCmdResult){.exited = false, .exit_code = EXIT_FAILURE, .error = ERR})
CMDResult wapp_shell_commander_execute(CMDOutHandling out_handling, Str8 *out_buf, const Str8List *cmd); WpCmdResult wpShellCommanderExecute(WpCmdOutHandling out_handling, WpStr8 *out_buf, const WpStr8List *cmd);
wapp_extern CMDError get_output_status(FILE *fp, i32 *status_out); wp_extern WpCmdError getOutputStatus(FILE *fp, i32 *status_out);
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !COMMANDER_H #endif // !COMMANDER_H
+21 -21
View File
@@ -7,36 +7,36 @@
#include "../../../common/platform/platform.h" #include "../../../common/platform/platform.h"
#include "../../../common/misc/misc_utils.h" #include "../../../common/misc/misc_utils.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
typedef enum { typedef enum WpCmdOutHandling {
SHELL_OUTPUT_DISCARD, WP_SHELL_OUTPUT_DISCARD,
SHELL_OUTPUT_PRINT, WP_SHELL_OUTPUT_PRINT,
SHELL_OUTPUT_CAPTURE, WP_SHELL_OUTPUT_CAPTURE,
} CMDOutHandling; } WpCmdOutHandling;
typedef enum { typedef enum WpCmdError {
SHELL_ERR_NO_ERROR, WP_SHELL_ERR_NO_ERROR,
SHELL_ERR_INVALID_ARGS, WP_SHELL_ERR_INVALID_ARGS,
SHELL_ERR_ALLOCATION_FAIL, WP_SHELL_ERR_ALLOCATION_FAIL,
SHELL_ERR_PROC_START_FAIL, WP_SHELL_ERR_PROC_START_FAIL,
SHELL_ERR_OUT_BUF_FULL, WP_SHELL_ERR_OUT_BUF_FULL,
SHELL_ERR_PROC_EXIT_FAIL, WP_SHELL_ERR_PROC_EXIT_FAIL,
} CMDError; } WpCmdError;
typedef struct CMDResult CMDResult; typedef struct WpCmdResult WpCmdResult;
struct CMDResult { struct WpCmdResult {
i32 exit_code; i32 exit_code;
CMDError error; WpCmdError error;
b8 exited; b8 exited;
wapp_misc_utils_reserve_padding(sizeof(b8) + sizeof(i32) + sizeof(CMDError)); wpMiscUtilsReservePadding(sizeof(b8) + sizeof(i32) + sizeof(WpCmdError));
}; };
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !COMMANDER_OUTPUT_H #endif // !COMMANDER_OUTPUT_H
@@ -3,23 +3,23 @@
#include "../../../../common/aliases/aliases.h" #include "../../../../common/aliases/aliases.h"
#include "../../../../common/platform/platform.h" #include "../../../../common/platform/platform.h"
#ifdef WAPP_PLATFORM_POSIX #ifdef WP_PLATFORM_POSIX
#include "../commander_output.h" #include "../commander_output.h"
#include "../../utils/shell_utils.h" #include "../../utils/shell_utils.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
CMDError get_output_status(FILE *fp, i32 *status_out) { WpCmdError getOutputStatus(FILE *fp, i32 *status_out) {
*status_out = wapp_shell_utils_pclose(fp); *status_out = wpShellUtilsPclose(fp);
if (!WIFEXITED(*status_out)) { if (!WIFEXITED(*status_out)) {
return SHELL_ERR_PROC_EXIT_FAIL; return WP_SHELL_ERR_PROC_EXIT_FAIL;
} }
*status_out = WEXITSTATUS(*status_out); *status_out = WEXITSTATUS(*status_out);
return SHELL_ERR_NO_ERROR; return WP_SHELL_ERR_NO_ERROR;
} }
#endif // !WAPP_PLATFORM_POSIX #endif // !WP_PLATFORM_POSIX
+7 -7
View File
@@ -3,22 +3,22 @@
#include "../../../../common/aliases/aliases.h" #include "../../../../common/aliases/aliases.h"
#include "../../../../common/platform/platform.h" #include "../../../../common/platform/platform.h"
#ifdef WAPP_PLATFORM_WINDOWS #ifdef WP_PLATFORM_WINDOWS
#include "../commander_output.h" #include "../commander_output.h"
#include "../../utils/shell_utils.h" #include "../../utils/shell_utils.h"
#include <stdio.h> #include <stdio.h>
CMDError get_output_status(FILE *fp, i32 *status_out) { WpCmdError getOutputStatus(FILE *fp, i32 *status_out) {
if (!feof(fp)) { if (!feof(fp)) {
// Ensure process is closed on failure // Ensure process is closed on failure
wapp_shell_utils_pclose(fp); wpShellUtilsPclose(fp);
return SHELL_ERR_PROC_EXIT_FAIL; return WP_SHELL_ERR_PROC_EXIT_FAIL;
} }
*status_out = wapp_shell_utils_pclose(fp); *status_out = wpShellUtilsPclose(fp);
return SHELL_ERR_NO_ERROR; return WP_SHELL_ERR_NO_ERROR;
} }
#endif // !WAPP_PLATFORM_WINDOWS #endif // !WP_PLATFORM_WINDOWS
@@ -4,33 +4,33 @@
#include "../../../../common/platform/platform.h" #include "../../../../common/platform/platform.h"
#include "../../../../base/strings/str8/str8.h" #include "../../../../base/strings/str8/str8.h"
#ifdef WAPP_PLATFORM_POSIX #ifdef WP_PLATFORM_POSIX
#include "../terminal_colours.h" #include "../terminal_colours.h"
#include <stdio.h> #include <stdio.h>
wapp_intern Str8RO colours[COUNT_TERM_COLOUR] = { wp_intern WpStr8RO colours[COUNT_TERM_COLOUR] = {
[WAPP_TERM_COLOUR_FG_BLACK] = wapp_str8_lit_ro_initialiser_list("\033[30m"), [WP_TERM_COLOUR_FG_BLACK] = wpStr8LitRoInitialiserList("\033[30m"),
[WAPP_TERM_COLOUR_FG_RED] = wapp_str8_lit_ro_initialiser_list("\033[31m"), [WP_TERM_COLOUR_FG_RED] = wpStr8LitRoInitialiserList("\033[31m"),
[WAPP_TERM_COLOUR_FG_GREEN] = wapp_str8_lit_ro_initialiser_list("\033[32m"), [WP_TERM_COLOUR_FG_GREEN] = wpStr8LitRoInitialiserList("\033[32m"),
[WAPP_TERM_COLOUR_FG_BLUE] = wapp_str8_lit_ro_initialiser_list("\033[34m"), [WP_TERM_COLOUR_FG_BLUE] = wpStr8LitRoInitialiserList("\033[34m"),
[WAPP_TERM_COLOUR_FG_CYAN] = wapp_str8_lit_ro_initialiser_list("\033[36m"), [WP_TERM_COLOUR_FG_CYAN] = wpStr8LitRoInitialiserList("\033[36m"),
[WAPP_TERM_COLOUR_FG_MAGENTA] = wapp_str8_lit_ro_initialiser_list("\033[35m"), [WP_TERM_COLOUR_FG_MAGENTA] = wpStr8LitRoInitialiserList("\033[35m"),
[WAPP_TERM_COLOUR_FG_YELLOW] = wapp_str8_lit_ro_initialiser_list("\033[33m"), [WP_TERM_COLOUR_FG_YELLOW] = wpStr8LitRoInitialiserList("\033[33m"),
[WAPP_TERM_COLOUR_FG_WHITE] = wapp_str8_lit_ro_initialiser_list("\033[37m"), [WP_TERM_COLOUR_FG_WHITE] = wpStr8LitRoInitialiserList("\033[37m"),
[WAPP_TERM_COLOUR_FG_BR_BLACK] = wapp_str8_lit_ro_initialiser_list("\033[90m"), [WP_TERM_COLOUR_FG_BR_BLACK] = wpStr8LitRoInitialiserList("\033[90m"),
[WAPP_TERM_COLOUR_FG_BR_RED] = wapp_str8_lit_ro_initialiser_list("\033[91m"), [WP_TERM_COLOUR_FG_BR_RED] = wpStr8LitRoInitialiserList("\033[91m"),
[WAPP_TERM_COLOUR_FG_BR_GREEN] = wapp_str8_lit_ro_initialiser_list("\033[92m"), [WP_TERM_COLOUR_FG_BR_GREEN] = wpStr8LitRoInitialiserList("\033[92m"),
[WAPP_TERM_COLOUR_FG_BR_BLUE] = wapp_str8_lit_ro_initialiser_list("\033[94m"), [WP_TERM_COLOUR_FG_BR_BLUE] = wpStr8LitRoInitialiserList("\033[94m"),
[WAPP_TERM_COLOUR_FG_BR_CYAN] = wapp_str8_lit_ro_initialiser_list("\033[96m"), [WP_TERM_COLOUR_FG_BR_CYAN] = wpStr8LitRoInitialiserList("\033[96m"),
[WAPP_TERM_COLOUR_FG_BR_MAGENTA] = wapp_str8_lit_ro_initialiser_list("\033[95m"), [WP_TERM_COLOUR_FG_BR_MAGENTA] = wpStr8LitRoInitialiserList("\033[95m"),
[WAPP_TERM_COLOUR_FG_BR_YELLOW] = wapp_str8_lit_ro_initialiser_list("\033[93m"), [WP_TERM_COLOUR_FG_BR_YELLOW] = wpStr8LitRoInitialiserList("\033[93m"),
[WAPP_TERM_COLOUR_FG_BR_WHITE] = wapp_str8_lit_ro_initialiser_list("\033[97m"), [WP_TERM_COLOUR_FG_BR_WHITE] = wpStr8LitRoInitialiserList("\033[97m"),
[WAPP_TERM_COLOUR_CLEAR] = wapp_str8_lit_ro_initialiser_list("\033[0m"), [WP_TERM_COLOUR_CLEAR] = wpStr8LitRoInitialiserList("\033[0m"),
}; };
void print_coloured_text(Str8RO *text, TerminalColour colour) { void printColouredText(WpStr8RO *text, WpTerminalColour colour) {
printf(WAPP_STR8_SPEC WAPP_STR8_SPEC, wapp_str8_varg(colours[colour]), wapp_str8_varg((*text))); printf("%" WP_STR8_SPEC "%" WP_STR8_SPEC, wpStr8Varg(colours[colour]), wpStr8Varg((*text)));
} }
#endif // !WAPP_PLATFORM_POSIX #endif // !WP_PLATFORM_POSIX
+6 -6
View File
@@ -4,15 +4,15 @@
#include "terminal_colours.h" #include "terminal_colours.h"
#include "../../../base/strings/str8/str8.h" #include "../../../base/strings/str8/str8.h"
void wapp_shell_termcolour_print_text(Str8RO *text, TerminalColour colour) { void wpShellTermcolourPrintText(WpStr8RO *text, WpTerminalColour colour) {
if (colour < WAPP_TERM_COLOUR_FG_BLACK || colour > WAPP_TERM_COLOUR_FG_BR_WHITE) { if (colour < WP_TERM_COLOUR_FG_BLACK || colour > WP_TERM_COLOUR_FG_BR_WHITE) {
return; return;
} }
print_coloured_text(text, colour); printColouredText(text, colour);
} }
void wapp_shell_termcolour_clear_colour(void) { void wpShellTermcolourClearColour(void) {
Str8RO empty = wapp_str8_lit_ro(""); WpStr8RO empty = wpStr8LitRo("");
print_coloured_text(&empty, WAPP_TERM_COLOUR_CLEAR); printColouredText(&empty, WP_TERM_COLOUR_CLEAR);
} }
+7 -7
View File
@@ -8,19 +8,19 @@
#include "../../../common/platform/platform.h" #include "../../../common/platform/platform.h"
#include "../../../base/strings/str8/str8.h" #include "../../../base/strings/str8/str8.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
// TODO (Abdelrahman): Look into moving away from stdio in the implementation // TODO (Abdelrahman): Look into moving away from stdio in the implementation
void wapp_shell_termcolour_print_text(Str8RO *text, TerminalColour colour); void wpShellTermcolourPrintText(WpStr8RO *text, WpTerminalColour colour);
void wapp_shell_termcolour_clear_colour(void); void wpShellTermcolourClearColour(void);
wapp_extern void print_coloured_text(Str8RO *text, TerminalColour colour); wp_extern void printColouredText(WpStr8RO *text, WpTerminalColour colour);
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !TERM_COLOUR_H #endif // !TERM_COLOUR_H
+23 -23
View File
@@ -6,34 +6,34 @@
#include "../../../common/aliases/aliases.h" #include "../../../common/aliases/aliases.h"
#include "../../../common/platform/platform.h" #include "../../../common/platform/platform.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
typedef enum { typedef enum WpTerminalColour {
WAPP_TERM_COLOUR_FG_BLACK, WP_TERM_COLOUR_FG_BLACK,
WAPP_TERM_COLOUR_FG_RED, WP_TERM_COLOUR_FG_RED,
WAPP_TERM_COLOUR_FG_GREEN, WP_TERM_COLOUR_FG_GREEN,
WAPP_TERM_COLOUR_FG_BLUE, WP_TERM_COLOUR_FG_BLUE,
WAPP_TERM_COLOUR_FG_CYAN, WP_TERM_COLOUR_FG_CYAN,
WAPP_TERM_COLOUR_FG_MAGENTA, WP_TERM_COLOUR_FG_MAGENTA,
WAPP_TERM_COLOUR_FG_YELLOW, WP_TERM_COLOUR_FG_YELLOW,
WAPP_TERM_COLOUR_FG_WHITE, WP_TERM_COLOUR_FG_WHITE,
WAPP_TERM_COLOUR_FG_BR_BLACK, WP_TERM_COLOUR_FG_BR_BLACK,
WAPP_TERM_COLOUR_FG_BR_RED, WP_TERM_COLOUR_FG_BR_RED,
WAPP_TERM_COLOUR_FG_BR_GREEN, WP_TERM_COLOUR_FG_BR_GREEN,
WAPP_TERM_COLOUR_FG_BR_BLUE, WP_TERM_COLOUR_FG_BR_BLUE,
WAPP_TERM_COLOUR_FG_BR_CYAN, WP_TERM_COLOUR_FG_BR_CYAN,
WAPP_TERM_COLOUR_FG_BR_MAGENTA, WP_TERM_COLOUR_FG_BR_MAGENTA,
WAPP_TERM_COLOUR_FG_BR_YELLOW, WP_TERM_COLOUR_FG_BR_YELLOW,
WAPP_TERM_COLOUR_FG_BR_WHITE, WP_TERM_COLOUR_FG_BR_WHITE,
WAPP_TERM_COLOUR_CLEAR, WP_TERM_COLOUR_CLEAR,
COUNT_TERM_COLOUR, COUNT_TERM_COLOUR,
} TerminalColour; } WpTerminalColour;
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !TERMINAL_COLOURS_H #endif // !TERMINAL_COLOURS_H
+27 -27
View File
@@ -4,7 +4,7 @@
#include "../../../../common/platform/platform.h" #include "../../../../common/platform/platform.h"
#include "../../../../base/strings/str8/str8.h" #include "../../../../base/strings/str8/str8.h"
#ifdef WAPP_PLATFORM_WINDOWS #ifdef WP_PLATFORM_WINDOWS
#include "../terminal_colours.h" #include "../terminal_colours.h"
#include "../../../../common/misc/misc_utils.h" #include "../../../../common/misc/misc_utils.h"
@@ -19,47 +19,47 @@ struct TermcolourData {
WORD default_colour; WORD default_colour;
WORD current_colour; WORD current_colour;
wapp_misc_utils_reserve_padding(sizeof(HANDLE) + sizeof(WORD) + sizeof(WORD)); wpMiscUtilsReservePadding(sizeof(HANDLE) + sizeof(WORD) + sizeof(WORD));
}; };
wapp_intern void init_data(TermcolourData *data); wp_intern void initData(TermcolourData *data);
wapp_intern WORD colours[COUNT_TERM_COLOUR] = { wp_intern WORD colours[COUNT_TERM_COLOUR] = {
[WAPP_TERM_COLOUR_FG_BLACK] = 0, [WP_TERM_COLOUR_FG_BLACK] = 0,
[WAPP_TERM_COLOUR_FG_RED] = FOREGROUND_RED, [WP_TERM_COLOUR_FG_RED] = FOREGROUND_RED,
[WAPP_TERM_COLOUR_FG_GREEN] = FOREGROUND_GREEN, [WP_TERM_COLOUR_FG_GREEN] = FOREGROUND_GREEN,
[WAPP_TERM_COLOUR_FG_BLUE] = FOREGROUND_BLUE, [WP_TERM_COLOUR_FG_BLUE] = FOREGROUND_BLUE,
[WAPP_TERM_COLOUR_FG_CYAN] = FOREGROUND_GREEN | FOREGROUND_BLUE, [WP_TERM_COLOUR_FG_CYAN] = FOREGROUND_GREEN | FOREGROUND_BLUE,
[WAPP_TERM_COLOUR_FG_MAGENTA] = FOREGROUND_RED | FOREGROUND_BLUE, [WP_TERM_COLOUR_FG_MAGENTA] = FOREGROUND_RED | FOREGROUND_BLUE,
[WAPP_TERM_COLOUR_FG_YELLOW] = FOREGROUND_RED | FOREGROUND_GREEN, [WP_TERM_COLOUR_FG_YELLOW] = FOREGROUND_RED | FOREGROUND_GREEN,
[WAPP_TERM_COLOUR_FG_WHITE] = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, [WP_TERM_COLOUR_FG_WHITE] = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,
[WAPP_TERM_COLOUR_FG_BR_BLACK] = FOREGROUND_INTENSITY, [WP_TERM_COLOUR_FG_BR_BLACK] = FOREGROUND_INTENSITY,
[WAPP_TERM_COLOUR_FG_BR_RED] = FOREGROUND_RED | FOREGROUND_INTENSITY, [WP_TERM_COLOUR_FG_BR_RED] = FOREGROUND_RED | FOREGROUND_INTENSITY,
[WAPP_TERM_COLOUR_FG_BR_GREEN] = FOREGROUND_GREEN | FOREGROUND_INTENSITY, [WP_TERM_COLOUR_FG_BR_GREEN] = FOREGROUND_GREEN | FOREGROUND_INTENSITY,
[WAPP_TERM_COLOUR_FG_BR_BLUE] = FOREGROUND_BLUE | FOREGROUND_INTENSITY, [WP_TERM_COLOUR_FG_BR_BLUE] = FOREGROUND_BLUE | FOREGROUND_INTENSITY,
[WAPP_TERM_COLOUR_FG_BR_CYAN] = FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY, [WP_TERM_COLOUR_FG_BR_CYAN] = FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY,
[WAPP_TERM_COLOUR_FG_BR_MAGENTA] = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY, [WP_TERM_COLOUR_FG_BR_MAGENTA] = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY,
[WAPP_TERM_COLOUR_FG_BR_YELLOW] = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY, [WP_TERM_COLOUR_FG_BR_YELLOW] = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY,
[WAPP_TERM_COLOUR_FG_BR_WHITE] = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY, [WP_TERM_COLOUR_FG_BR_WHITE] = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY,
}; };
void print_coloured_text(Str8RO *text, TerminalColour colour) { void printColouredText(WpStr8RO *text, WpTerminalColour colour) {
wapp_persist TermcolourData data = {0}; wp_persist TermcolourData data = {0};
if (data.handle == 0) { if (data.handle == 0) {
init_data(&data); initData(&data);
} }
if (colour == WAPP_TERM_COLOUR_CLEAR) { if (colour == WP_TERM_COLOUR_CLEAR) {
data.current_colour = data.default_colour; data.current_colour = data.default_colour;
} else { } else {
data.current_colour = colours[colour]; data.current_colour = colours[colour];
} }
SetConsoleTextAttribute(data.handle, data.current_colour); SetConsoleTextAttribute(data.handle, data.current_colour);
printf(WAPP_STR8_SPEC, wapp_str8_varg((*text))); printf("%" WP_STR8_SPEC, wpStr8Varg((*text)));
} }
wapp_intern void init_data(TermcolourData *data) { wp_intern void initData(TermcolourData *data) {
// create handle // create handle
data->handle = GetStdHandle(STD_OUTPUT_HANDLE); data->handle = GetStdHandle(STD_OUTPUT_HANDLE);
@@ -70,4 +70,4 @@ wapp_intern void init_data(TermcolourData *data) {
data->current_colour = data->default_colour; data->current_colour = data->default_colour;
} }
#endif // !WAPP_PLATFORM_WINDOWS #endif // !WP_PLATFORM_WINDOWS
+10 -10
View File
@@ -7,20 +7,20 @@
#include "../../../common/platform/platform.h" #include "../../../common/platform/platform.h"
#include <stdio.h> #include <stdio.h>
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#ifdef WAPP_PLATFORM_WINDOWS #ifdef WP_PLATFORM_WINDOWS
#define wapp_shell_utils_popen _popen #define wpShellUtilsPopen _popen
#define wapp_shell_utils_pclose _pclose #define wpShellUtilsPclose _pclose
#else #else
#define wapp_shell_utils_popen popen #define wpShellUtilsPopen popen
#define wapp_shell_utils_pclose pclose #define wpShellUtilsPclose pclose
#endif /* ifdef WAPP_PLATFORM_WINDOWS */ #endif /* ifdef WP_PLATFORM_WINDOWS */
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !SHELL_UTILS_H #endif // !SHELL_UTILS_H
+97
View File
@@ -0,0 +1,97 @@
// vim:fileencoding=utf-8:foldmethod=marker
#include "splitmix64.h"
#include "../../common/aliases/aliases.h"
#include "../../common/assert/assert.h"
#include "../../common/platform/platform.h"
#include <stdlib.h>
#include <time.h>
wp_intern void seedOsGenerator(u64 seed);
wp_intern u64 genRandomNumber(void);
WpSplitmix64State wpPrngSplitmix64Init(void) {
wp_persist b8 seeded = false;
if (!seeded) {
seeded = true;
seedOsGenerator(0);
}
return (WpSplitmix64State){ .seed = genRandomNumber() };
}
WpSplitmix64State wpPrngSplitmix64InitWithSeed(u64 seed) {
return (WpSplitmix64State){ .seed = seed };
}
u64 wpPrngSplitmix64(WpSplitmix64State *state) {
state->seed += 0x9E3779B97f4A7C15;
u64 result = state->seed;
result = (result ^ (result >> 30)) * 0xBF58476D1CE4E5B9;
result = (result ^ (result >> 27)) * 0x94D049BB133111EB;
return result ^ (result >> 31);
}
u64 wpPrngSplitmix64InRange(WpSplitmix64State *state, u64 start, u64 end) {
return wpPrngSplitmix64(state) % (end - start) + start;
}
u64 wpPrngSplitmix64Choice(WpSplitmix64State *state, u64 available_choices) {
return wpPrngSplitmix64(state) % available_choices;
}
#if defined(WP_PLATFORM_C) && WP_PLATFORM_C_VERSION >= WP_PLATFORM_C11_VERSION
#ifdef WP_PLATFORM_POSIX
wp_intern void seedOsGenerator(u64 seed) {
if (seed == 0) {
struct timespec ts = {0};
int result = clock_gettime(CLOCK_MONOTONIC_RAW, &ts);
wpRuntimeAssert(result == 0, "Invalid seed value");
seed = (u64)ts.tv_nsec;
}
srand48(seed);
}
wp_intern u64 genRandomNumber(void) {
return lrand48();
}
#else
wp_intern void seedOsGenerator(u64 seed) {
if (seed == 0) {
struct timespec ts = {0};
int result = timespec_get(&ts, TIME_UTC);
wpRuntimeAssert(result != 0, "Invalid seed value");
seed = (u64)ts.tv_nsec;
}
srand(seed);
}
wp_intern u64 genRandomNumber(void) {
i32 n1 = rand();
i32 n2 = rand();
return (((u64)n1) << 32 | (u64)n2);
}
#endif // !WP_PLATFORM_POSIX
#else
wp_intern void seedOsGenerator(u64 seed) {
if (seed == 0) {
time_t result = time(NULL);
wpRuntimeAssert(result != (time_t)(-1), "Invalid seed value");
seed = (u64)result;
}
srand(seed);
}
wp_intern u64 genRandomNumber(void) {
i32 n1 = rand();
i32 n2 = rand();
return (((u64)n1) << 32 | (u64)n2);
}
#endif // !WP_PLATFORM_C
+18
View File
@@ -0,0 +1,18 @@
// vim:fileencoding=utf-8:foldmethod=marker
#ifndef SPLITMIX64_H
#define SPLITMIX64_H
#include "../../common/aliases/aliases.h"
typedef struct WpSplitmix64State {
u64 seed;
} WpSplitmix64State;
WpSplitmix64State wpPrngSplitmix64Init(void);
WpSplitmix64State wpPrngSplitmix64InitWithSeed(u64 seed);
u64 wpPrngSplitmix64(WpSplitmix64State *state);
u64 wpPrngSplitmix64InRange(WpSplitmix64State *state, u64 start, u64 end);
u64 wpPrngSplitmix64Choice(WpSplitmix64State *state, u64 available_choices);
#endif // !SPLITMIX64_H
+1
View File
@@ -3,6 +3,7 @@
#ifndef WAPP_PRNG_C #ifndef WAPP_PRNG_C
#define WAPP_PRNG_C #define WAPP_PRNG_C
#include "splitmix64/splitmix64.c"
#include "xorshift/xorshift.c" #include "xorshift/xorshift.c"
#endif // !WAPP_PRNG_C #endif // !WAPP_PRNG_C
+1
View File
@@ -3,6 +3,7 @@
#ifndef WAPP_PRNG_H #ifndef WAPP_PRNG_H
#define WAPP_PRNG_H #define WAPP_PRNG_H
#include "splitmix64/splitmix64.h"
#include "xorshift/xorshift.h" #include "xorshift/xorshift.h"
#include "../common/wapp_common.h" #include "../common/wapp_common.h"
+34 -76
View File
@@ -1,40 +1,33 @@
// vim:fileencoding=utf-8:foldmethod=marker // vim:fileencoding=utf-8:foldmethod=marker
#include "xorshift.h" #include "xorshift.h"
#include "../splitmix64/splitmix64.h"
#include "../../common/aliases/aliases.h" #include "../../common/aliases/aliases.h"
#include "../../common/assert/assert.h" #include "../../common/misc/misc_utils.h"
#include "../../common/platform/platform.h"
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <time.h>
typedef struct SplitMix64State SplitMix64State; WpXor256State wpPrngXorshiftInit(void) {
struct SplitMix64State { return wpPrngXorshiftInitWithSeed(0);
u64 seed; }
};
wapp_intern u64 rol64(u64 x, u64 bits); WpXor256State wpPrngXorshiftInitWithSeed(u64 seed) {
wapp_intern u64 split_mix_64(SplitMix64State *state); WpSplitmix64State sm64;
wapp_intern void seed_os_generator(void); if (seed > 0) {
wapp_intern u64 generate_random_number(void); sm64 = wpPrngSplitmix64InitWithSeed(seed);
} else {
XOR256State wapp_prng_xorshift_init_state(void) { sm64 = wpPrngSplitmix64Init();
wapp_persist b8 seeded = false;
if (!seeded) {
seeded = true;
seed_os_generator();
} }
SplitMix64State sm64 = {.seed = generate_random_number()}; return (WpXor256State){
.x = wpPrngSplitmix64(&sm64),
return (XOR256State){ .y = wpPrngSplitmix64(&sm64),
.x = split_mix_64(&sm64), .z = wpPrngSplitmix64(&sm64),
.y = split_mix_64(&sm64), .w = wpPrngSplitmix64(&sm64),
.z = split_mix_64(&sm64),
.w = split_mix_64(&sm64),
}; };
} }
u64 wapp_prng_xorshift_256(XOR256State *state) { u64 wpPrngXorshift256(WpXor256State *state) {
u64 t = state->x ^ (state->x << 11); u64 t = state->x ^ (state->x << 11);
state->x = state->y; state->x = state->y;
@@ -45,8 +38,8 @@ u64 wapp_prng_xorshift_256(XOR256State *state) {
return state->w; return state->w;
} }
u64 wapp_prng_xorshift_256ss(XOR256State *state) { u64 wpPrngXorshift256ss(WpXor256State *state) {
const u64 result = rol64(state->z * 5, 7) * 9; const u64 result = wpMiscUtilsRotl64(state->z * 5, 7) * 9;
const u64 t = state->z << 17; const u64 t = state->z << 17;
state->y ^= state->w; state->y ^= state->w;
@@ -55,12 +48,12 @@ u64 wapp_prng_xorshift_256ss(XOR256State *state) {
state->w ^= state->x; state->w ^= state->x;
state->y ^= t; state->y ^= t;
state->x = rol64(state->x, 45); state->x = wpMiscUtilsRotl64(state->x, 45);
return result; return result;
} }
u64 wapp_prng_xorshift_256p(XOR256State *state) { u64 wpPrngXorshift256p(WpXor256State *state) {
const u64 result = state->w + state->x; const u64 result = state->w + state->x;
const u64 t = state->z << 17; const u64 t = state->z << 17;
@@ -70,66 +63,31 @@ u64 wapp_prng_xorshift_256p(XOR256State *state) {
state->w ^= state->x; state->w ^= state->x;
state->y ^= t; state->y ^= t;
state->x = rol64(state->x, 45); state->x = wpMiscUtilsRotl64(state->x, 45);
return result; return result;
} }
wapp_intern u64 rol64(u64 x, u64 bits) { u64 wpPrngXorshift256InRange(WpXor256State *state, u64 start, u64 end) {
return (x << bits) | (x >> (64 - bits)); return wpPrngXorshift256(state) % (end - start) + start;
} }
wapp_intern u64 split_mix_64(SplitMix64State *state) { u64 wpPrngXorshift256ssInRange(WpXor256State *state, u64 start, u64 end) {
state->seed += 0x9E3779B97f4A7C15; return wpPrngXorshift256ss(state) % (end - start) + start;
u64 result = state->seed;
result = (result ^ (result >> 30)) * 0xBF58476D1CE4E5B9;
result = (result ^ (result >> 27)) * 0x94D049BB133111EB;
return result ^ (result >> 31);
} }
#if defined(WAPP_PLATFORM_C) && WAPP_PLATFORM_C_VERSION >= WAPP_PLATFORM_C11_VERSION u64 wpPrngXorshift256pInRange(WpXor256State *state, u64 start, u64 end) {
#ifdef WAPP_PLATFORM_POSIX return wpPrngXorshift256p(state) % (end - start) + start;
wapp_intern void seed_os_generator(void) {
struct timespec ts = {0};
int result = clock_gettime(CLOCK_MONOTONIC_RAW, &ts);
wapp_runtime_assert(result == 0, "Invalid seed value");
srand48(ts.tv_nsec);
} }
wapp_intern u64 generate_random_number(void) { u64 wpPrngXorshift256Choice(WpXor256State *state, u64 available_choices) {
return lrand48(); return wpPrngXorshift256(state) % available_choices;
}
#else
wapp_intern void seed_os_generator(void) {
struct timespec ts = {0};
int result = timespec_get(&ts, TIME_UTC);
wapp_runtime_assert(result != 0, "Invalid seed value");
srand(ts.tv_nsec);
} }
wapp_intern u64 generate_random_number(void) { u64 wpPrngXorshift256ssChoice(WpXor256State *state, u64 available_choices) {
i32 n1 = rand(); return wpPrngXorshift256ss(state) % available_choices;
i32 n2 = rand();
return (((u64)n1) << 32 | (u64)n2);
}
#endif // !WAPP_PLATFORM_POSIX
#else
wapp_intern void seed_os_generator(void) {
time_t result = time(NULL);
wapp_runtime_assert(result != (time_t)(-1), "Invalid seed value");
srand(result);
} }
wapp_intern u64 generate_random_number(void) { u64 wpPrngXorshift256pChoice(WpXor256State *state, u64 available_choices) {
i32 n1 = rand(); return wpPrngXorshift256p(state) % available_choices;
i32 n2 = rand();
return (((u64)n1) << 32 | (u64)n2);
} }
#endif // !WAPP_PLATFORM_C
+17 -10
View File
@@ -6,25 +6,32 @@
#include "../../common/aliases/aliases.h" #include "../../common/aliases/aliases.h"
#include "../../common/platform/platform.h" #include "../../common/platform/platform.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
typedef struct XOR256State XOR256State; typedef struct WpXor256State WpXor256State;
struct XOR256State { struct WpXor256State {
u64 x; u64 x;
u64 y; u64 y;
u64 z; u64 z;
u64 w; u64 w;
}; };
XOR256State wapp_prng_xorshift_init_state(void); WpXor256State wpPrngXorshiftInit(void);
u64 wapp_prng_xorshift_256(XOR256State *state); WpXor256State wpPrngXorshiftInitWithSeed(u64 seed);
u64 wapp_prng_xorshift_256ss(XOR256State *state); u64 wpPrngXorshift256(WpXor256State *state);
u64 wapp_prng_xorshift_256p(XOR256State *state); u64 wpPrngXorshift256ss(WpXor256State *state);
u64 wpPrngXorshift256p(WpXor256State *state);
u64 wpPrngXorshift256InRange(WpXor256State *state, u64 start, u64 end);
u64 wpPrngXorshift256ssInRange(WpXor256State *state, u64 start, u64 end);
u64 wpPrngXorshift256pInRange(WpXor256State *state, u64 start, u64 end);
u64 wpPrngXorshift256Choice(WpXor256State *state, u64 available_choices);
u64 wpPrngXorshift256ssChoice(WpXor256State *state, u64 available_choices);
u64 wpPrngXorshift256pChoice(WpXor256State *state, u64 available_choices);
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !XORSHIFT_H #endif // !XORSHIFT_H
+17 -17
View File
@@ -8,23 +8,23 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
wapp_intern void handle_test_result(TestFuncResult result); wp_intern void handleTestResult(WpTestFuncResult result);
void run_tests(TestFunc *func1, ...) { void runTests(WpTestFunc *func1, ...) {
printf("\n"); printf("\n");
handle_test_result(func1()); handleTestResult(func1());
va_list args; va_list args;
va_start(args, func1); va_start(args, func1);
TestFunc *func = va_arg(args, TestFunc *); WpTestFunc *func = va_arg(args, WpTestFunc *);
while (func) { while (func) {
TestFuncResult result = func(); WpTestFuncResult result = func();
handle_test_result(result); handleTestResult(result);
func = va_arg(args, TestFunc *); func = va_arg(args, WpTestFunc *);
} }
va_end(args); va_end(args);
@@ -32,22 +32,22 @@ void run_tests(TestFunc *func1, ...) {
printf("\n"); printf("\n");
} }
wapp_intern void handle_test_result(TestFuncResult result) { wp_intern void handleTestResult(WpTestFuncResult result) {
TerminalColour colour; WpTerminalColour colour;
Str8 result_text = wapp_str8_buf(64); WpStr8 result_text = wpStr8Buf(64);
if (result.passed) { if (result.passed) {
colour = WAPP_TERM_COLOUR_FG_BR_GREEN; colour = WP_TERM_COLOUR_FG_BR_GREEN;
wapp_str8_copy_cstr_capped(&result_text, "PASSED"); wpStr8CopyCstrCapped(&result_text, "PASSED");
} else { } else {
colour = WAPP_TERM_COLOUR_FG_BR_RED; colour = WP_TERM_COLOUR_FG_BR_RED;
wapp_str8_copy_cstr_capped(&result_text, "FAILED"); wpStr8CopyCstrCapped(&result_text, "FAILED");
} }
printf("["); printf("[");
wapp_shell_termcolour_print_text(&result_text, colour); wpShellTermcolourPrintText(&result_text, colour);
wapp_shell_termcolour_clear_colour(); wpShellTermcolourClearColour();
printf("] " WAPP_STR8_SPEC "\n", wapp_str8_varg(result.name)); printf("] %" WP_STR8_SPEC "\n", wpStr8Varg(result.name));
if (!result.passed) { if (!result.passed) {
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
+13 -13
View File
@@ -7,30 +7,30 @@
#include "../../common/platform/platform.h" #include "../../common/platform/platform.h"
#include "../../base/strings/str8/str8.h" #include "../../base/strings/str8/str8.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#define wapp_tester_result(PASSED) (TestFuncResult{wapp_str8_lit_ro(__func__), PASSED, {}}) #define wpTesterResult(PASSED) (WpTestFuncResult{wpStr8LitRo(__func__), PASSED, {}})
#else #else
#define wapp_tester_result(PASSED) ((TestFuncResult){.name = wapp_str8_lit_ro(__func__), .passed = PASSED}) #define wpTesterResult(PASSED) ((WpTestFuncResult){.name = wpStr8LitRo(__func__), .passed = PASSED})
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#define wapp_tester_run_tests(...) run_tests(__VA_ARGS__, NULL) #define wpTesterRun(...) runTests(__VA_ARGS__, NULL)
typedef struct TestFuncResult TestFuncResult; typedef struct WpTestFuncResult WpTestFuncResult;
struct TestFuncResult { struct WpTestFuncResult {
Str8 name; WpStr8 name;
b8 passed; b8 passed;
wapp_misc_utils_reserve_padding(sizeof(Str8) + sizeof(b8)); wpMiscUtilsReservePadding(sizeof(WpStr8) + sizeof(b8));
}; };
typedef TestFuncResult(TestFunc)(void); typedef WpTestFuncResult(WpTestFunc)(void);
void run_tests(TestFunc *func1, ...); void runTests(WpTestFunc *func1, ...);
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !TESTER_H #endif // !TESTER_H
+14 -14
View File
@@ -15,30 +15,30 @@ struct UUID4 {
u64 low; u64 low;
}; };
wapp_intern UUID4 generate_uuid4(void); wp_intern UUID4 genUuid4(void);
wapp_intern void uuid4_to_uuid(const UUID4* uuid4, WUUID *uuid); wp_intern void uuid4ToUuid(const UUID4* uuid4, WpUuid *uuid);
WUUID *wapp_uuid_init_uuid4(WUUID *uuid) { WpUuid *wpUuidInitUuid4(WpUuid *uuid) {
wapp_debug_assert(uuid != NULL, "`uuid` should not be NULL"); wpDebugAssert(uuid != NULL, "`uuid` should not be NULL");
UUID4 uuid4 = generate_uuid4(); UUID4 uuid4 = genUuid4();
uuid4_to_uuid(&uuid4, uuid); uuid4ToUuid(&uuid4, uuid);
return uuid; return uuid;
} }
wapp_intern UUID4 generate_uuid4(void) { wp_intern UUID4 genUuid4(void) {
wapp_persist XOR256State state = {0}; wp_persist WpXor256State state = {0};
wapp_persist b8 initialised = false; wp_persist b8 initialised = false;
if (!initialised) { if (!initialised) {
initialised = true; initialised = true;
state = wapp_prng_xorshift_init_state(); state = wpPrngXorshiftInit();
} }
UUID4 uuid = (UUID4){ UUID4 uuid = (UUID4){
.high = wapp_prng_xorshift_256(&state), .high = wpPrngXorshift256(&state),
.low = wapp_prng_xorshift_256(&state), .low = wpPrngXorshift256(&state),
}; };
uuid.high = (uuid.high & 0xffffffffffff0fff) | 0x0000000000004000; uuid.high = (uuid.high & 0xffffffffffff0fff) | 0x0000000000004000;
@@ -47,12 +47,12 @@ wapp_intern UUID4 generate_uuid4(void) {
return uuid; return uuid;
} }
wapp_intern void uuid4_to_uuid(const UUID4* uuid4, WUUID *uuid) { wp_intern void uuid4ToUuid(const UUID4* uuid4, WpUuid *uuid) {
u64 group1 = uuid4->high >> 32; u64 group1 = uuid4->high >> 32;
u64 group2 = (uuid4->high << 32) >> 48; u64 group2 = (uuid4->high << 32) >> 48;
u64 group3 = (uuid4->high << 48) >> 48; u64 group3 = (uuid4->high << 48) >> 48;
u64 group4 = uuid4->low >> 48; u64 group4 = uuid4->low >> 48;
u64 group5 = (uuid4->low << 16) >> 16; u64 group5 = (uuid4->low << 16) >> 16;
wapp_str8_format(&(uuid->uuid), UUID_STR_FORMAT, group1, group2, group3, group4, group5); wpStr8Format(&(uuid->uuid), UUID_STR_FORMAT, group1, group2, group3, group4, group5);
} }
+19 -19
View File
@@ -7,44 +7,44 @@
#include "../common/platform/platform.h" #include "../common/platform/platform.h"
#include "../base/strings/str8/str8.h" #include "../base/strings/str8/str8.h"
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#define UUID_BUF_LENGTH 48 #define WP_UUID_BUF_LENGTH 48
#define WAPP_UUID_SPEC WAPP_STR8_SPEC #define WP_UUID_SPEC WP_STR8_SPEC
#define wapp_uuid_varg(WUUID) wapp_str8_varg((WUUID).uuid) #define wpUuidVarg(WpUuid) wpStr8Varg((WpUuid).uuid)
typedef struct WUUID WUUID; typedef struct WpUuid WpUuid;
struct WUUID { struct WpUuid {
Str8 uuid; WpStr8 uuid;
}; };
// TODO (Abdelrahman): Update UUID implementation to work properly with C++ and tests for validation // TODO (Abdelrahman): Update UUID implementation to work properly with C++ and tests for validation
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
#define wapp_uuid_gen_uuid4() ([&](){ \ #define wpUuidGenUuid4() ([&](){ \
wapp_persist WUUID uuid = wapp_uuid_create(); \ wp_persist WpUuid uuid = wpUuidCreate(); \
return *(wapp_uuid_init_uuid4(&uuid)); \ return *(wpUuidInitUuid4(&uuid)); \
}()) }())
#else #else
#define wapp_uuid_gen_uuid4() *(wapp_uuid_init_uuid4(&wapp_uuid_create())) #define wpUuidGenUuid4() *(wpUuidInitUuid4(&wpUuidCreate()))
#endif #endif
/* Low level UUID API */ /* Low level UUID API */
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
#define wapp_uuid_create() ([&](){ return WUUID{wapp_str8_buf(UUID_BUF_LENGTH)}; }()) #define wpUuidCreate() ([&](){ return WpUuid{wpStr8Buf(WP_UUID_BUF_LENGTH)}; }())
#else #else
#define wapp_uuid_create() ((WUUID){.uuid = wapp_str8_buf(UUID_BUF_LENGTH)}) #define wpUuidCreate() ((WpUuid){.uuid = wpStr8Buf(WP_UUID_BUF_LENGTH)})
#endif #endif
// Just returns the same pointer that was passed in with the UUID initialised. // Just returns the same pointer that was passed in with the UUID initialised.
// Fails when passed a NULL pointer. // Fails when passed a NULL pointer.
WUUID *wapp_uuid_init_uuid4(WUUID *uuid); WpUuid *wpUuidInitUuid4(WpUuid *uuid);
#ifdef WAPP_PLATFORM_CPP #ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !UUID_H #endif // !UUID_H
+25 -25
View File
@@ -6,62 +6,62 @@
// allocation are aligned to power of 2 boundaries, the number of i32 values needed is hardcoded. // allocation are aligned to power of 2 boundaries, the number of i32 values needed is hardcoded.
#define TEMP_BUF_SIZE (40 + sizeof(i32) * 8) #define TEMP_BUF_SIZE (40 + sizeof(i32) * 8)
wapp_intern u8 temp_buf[TEMP_BUF_SIZE] = {0}; wp_intern u8 temp_buf[TEMP_BUF_SIZE] = {0};
wapp_intern Allocator temp_allocator = {0}; wp_intern WpAllocator temp_allocator = {0};
TestFuncResult test_arena_allocator(void) { WpTestFuncResult test_arena_allocator(void) {
Allocator allocator = wapp_mem_arena_allocator_init(4096); WpAllocator allocator = wpMemArenaAllocatorInit(4096);
b8 result = allocator.obj != NULL && allocator.alloc != NULL && b8 result = allocator.obj != NULL && allocator.alloc != NULL &&
allocator.alloc_aligned != NULL && allocator.alloc_aligned != NULL &&
allocator.realloc != NULL && allocator.realloc_aligned != NULL && allocator.realloc != NULL && allocator.realloc_aligned != NULL &&
allocator.free == NULL; allocator.free == NULL;
void *ptr = wapp_mem_allocator_alloc(&allocator, 20); void *ptr = wpMemAllocatorAlloc(&allocator, 20);
result = result && (ptr != NULL); result = result && (ptr != NULL);
wapp_mem_arena_allocator_destroy(&allocator); wpMemArenaAllocatorDestroy(&allocator);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_allocator_with_buffer(void) { WpTestFuncResult test_arena_allocator_with_buffer(void) {
u8 buffer[KiB(4)] = {0}; u8 buffer[KiB(4)] = {0};
Allocator allocator = wapp_mem_arena_allocator_init_with_buffer(buffer, KiB(4)); WpAllocator allocator = wpMemArenaAllocatorInitWithBuffer(buffer, KiB(4));
b8 result = allocator.obj != NULL && allocator.alloc != NULL && b8 result = allocator.obj != NULL && allocator.alloc != NULL &&
allocator.alloc_aligned != NULL && allocator.alloc_aligned != NULL &&
allocator.realloc != NULL && allocator.realloc_aligned != NULL && allocator.realloc != NULL && allocator.realloc_aligned != NULL &&
allocator.free == NULL; allocator.free == NULL;
void *ptr = wapp_mem_allocator_alloc(&allocator, 20); void *ptr = wpMemAllocatorAlloc(&allocator, 20);
result = result && (ptr != NULL); result = result && (ptr != NULL);
wapp_mem_arena_allocator_destroy(&allocator); wpMemArenaAllocatorDestroy(&allocator);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_allocator_temp_begin(void) { WpTestFuncResult test_arena_allocator_temp_begin(void) {
temp_allocator = wapp_mem_arena_allocator_init_with_buffer(temp_buf, TEMP_BUF_SIZE); temp_allocator = wpMemArenaAllocatorInitWithBuffer(temp_buf, TEMP_BUF_SIZE);
i32 *num1 = (i32 *)wapp_mem_allocator_alloc(&temp_allocator, sizeof(i32)); i32 *num1 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32));
b8 result = num1 != NULL; b8 result = num1 != NULL;
wapp_mem_arena_allocator_temp_begin(&temp_allocator); wpMemArenaAllocatorTempBegin(&temp_allocator);
i32 *num2 = (i32 *)wapp_mem_allocator_alloc(&temp_allocator, sizeof(i32)); i32 *num2 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32));
result = result && num2 != NULL; result = result && num2 != NULL;
i32 *num3 = (i32 *)wapp_mem_allocator_alloc(&temp_allocator, sizeof(i32)); i32 *num3 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32));
result = result && num3 == NULL; result = result && num3 == NULL;
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_allocator_temp_end(void) { WpTestFuncResult test_arena_allocator_temp_end(void) {
wapp_mem_arena_allocator_temp_end(&temp_allocator); wpMemArenaAllocatorTempEnd(&temp_allocator);
i32 *num1 = (i32 *)wapp_mem_allocator_alloc(&temp_allocator, sizeof(i32)); i32 *num1 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32));
b8 result = num1 != NULL; b8 result = num1 != NULL;
i32 *num2 = (i32 *)wapp_mem_allocator_alloc(&temp_allocator, sizeof(i32)); i32 *num2 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32));
result = result && num2 == NULL; result = result && num2 == NULL;
wapp_mem_arena_allocator_destroy(&temp_allocator); wpMemArenaAllocatorDestroy(&temp_allocator);
return wapp_tester_result(result); return wpTesterResult(result);
} }
+25 -25
View File
@@ -6,62 +6,62 @@
// allocation are aligned to power of 2 boundaries, the number of i32 values needed is hardcoded. // allocation are aligned to power of 2 boundaries, the number of i32 values needed is hardcoded.
#define TEMP_BUF_SIZE (40 + sizeof(i32) * 8) #define TEMP_BUF_SIZE (40 + sizeof(i32) * 8)
wapp_intern u8 temp_buf[TEMP_BUF_SIZE] = {}; wp_intern u8 temp_buf[TEMP_BUF_SIZE] = {};
wapp_intern Allocator temp_allocator = {}; wp_intern WpAllocator temp_allocator = {};
TestFuncResult test_arena_allocator(void) { WpTestFuncResult test_arena_allocator(void) {
Allocator allocator = wapp_mem_arena_allocator_init(4096); WpAllocator allocator = wpMemArenaAllocatorInit(4096);
b8 result = allocator.obj != nullptr && allocator.alloc != nullptr && b8 result = allocator.obj != nullptr && allocator.alloc != nullptr &&
allocator.alloc_aligned != nullptr && allocator.alloc_aligned != nullptr &&
allocator.realloc != nullptr && allocator.realloc_aligned != nullptr && allocator.realloc != nullptr && allocator.realloc_aligned != nullptr &&
allocator.free == nullptr; allocator.free == nullptr;
void *ptr = wapp_mem_allocator_alloc(&allocator, 20); void *ptr = wpMemAllocatorAlloc(&allocator, 20);
result = result && (ptr != nullptr); result = result && (ptr != nullptr);
wapp_mem_arena_allocator_destroy(&allocator); wpMemArenaAllocatorDestroy(&allocator);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_allocator_with_buffer(void) { WpTestFuncResult test_arena_allocator_with_buffer(void) {
u8 buffer[KiB(4)] = {0}; u8 buffer[KiB(4)] = {0};
Allocator allocator = wapp_mem_arena_allocator_init_with_buffer(buffer, KiB(4)); WpAllocator allocator = wpMemArenaAllocatorInitWithBuffer(buffer, KiB(4));
b8 result = allocator.obj != NULL && allocator.alloc != NULL && b8 result = allocator.obj != NULL && allocator.alloc != NULL &&
allocator.alloc_aligned != NULL && allocator.alloc_aligned != NULL &&
allocator.realloc != NULL && allocator.realloc_aligned != NULL && allocator.realloc != NULL && allocator.realloc_aligned != NULL &&
allocator.free == NULL; allocator.free == NULL;
void *ptr = wapp_mem_allocator_alloc(&allocator, 20); void *ptr = wpMemAllocatorAlloc(&allocator, 20);
result = result && (ptr != NULL); result = result && (ptr != NULL);
wapp_mem_arena_allocator_destroy(&allocator); wpMemArenaAllocatorDestroy(&allocator);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_allocator_temp_begin(void) { WpTestFuncResult test_arena_allocator_temp_begin(void) {
temp_allocator = wapp_mem_arena_allocator_init_with_buffer(temp_buf, TEMP_BUF_SIZE); temp_allocator = wpMemArenaAllocatorInitWithBuffer(temp_buf, TEMP_BUF_SIZE);
i32 *num1 = (i32 *)wapp_mem_allocator_alloc(&temp_allocator, sizeof(i32)); i32 *num1 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32));
b8 result = num1 != NULL; b8 result = num1 != NULL;
wapp_mem_arena_allocator_temp_begin(&temp_allocator); wpMemArenaAllocatorTempBegin(&temp_allocator);
i32 *num2 = (i32 *)wapp_mem_allocator_alloc(&temp_allocator, sizeof(i32)); i32 *num2 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32));
result = result && num2 != NULL; result = result && num2 != NULL;
i32 *num3 = (i32 *)wapp_mem_allocator_alloc(&temp_allocator, sizeof(i32)); i32 *num3 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32));
result = result && num3 == NULL; result = result && num3 == NULL;
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_allocator_temp_end(void) { WpTestFuncResult test_arena_allocator_temp_end(void) {
wapp_mem_arena_allocator_temp_end(&temp_allocator); wpMemArenaAllocatorTempEnd(&temp_allocator);
i32 *num1 = (i32 *)wapp_mem_allocator_alloc(&temp_allocator, sizeof(i32)); i32 *num1 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32));
b8 result = num1 != NULL; b8 result = num1 != NULL;
i32 *num2 = (i32 *)wapp_mem_allocator_alloc(&temp_allocator, sizeof(i32)); i32 *num2 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32));
result = result && num2 == NULL; result = result && num2 == NULL;
wapp_mem_arena_allocator_destroy(&temp_allocator); wpMemArenaAllocatorDestroy(&temp_allocator);
return wapp_tester_result(result); return wpTesterResult(result);
} }
+4 -4
View File
@@ -3,9 +3,9 @@
#include "wapp.h" #include "wapp.h"
TestFuncResult test_arena_allocator(void); WpTestFuncResult test_arena_allocator(void);
TestFuncResult test_arena_allocator_with_buffer(void); WpTestFuncResult test_arena_allocator_with_buffer(void);
TestFuncResult test_arena_allocator_temp_begin(void); WpTestFuncResult test_arena_allocator_temp_begin(void);
TestFuncResult test_arena_allocator_temp_end(void); WpTestFuncResult test_arena_allocator_temp_end(void);
#endif // !TEST_ALLOCATOR_H #endif // !TEST_ALLOCATOR_H
+62 -62
View File
@@ -4,143 +4,143 @@
#define ARENA_CAPACITY KiB(16) #define ARENA_CAPACITY KiB(16)
#define ARENA_BUF_SIZE KiB(4) #define ARENA_BUF_SIZE KiB(4)
// NOTE (Abdelrahman): Cannot query size of Arena here so it's hardcoded. Similarly, since arena // NOTE (Abdelrahman): Cannot query size of WpArena here so it's hardcoded. Similarly, since arena
// allocation are aligned to power of 2 boundaries, the number of i32 values needed is hardcoded. // allocation are aligned to power of 2 boundaries, the number of i32 values needed is hardcoded.
#define TEMP_BUF_SIZE (40 + sizeof(i32) * 8) #define TEMP_BUF_SIZE (40 + sizeof(i32) * 8)
wapp_intern Arena *arena = NULL; wp_intern WpArena *arena = NULL;
wapp_intern i32 count = 20; wp_intern i32 count = 20;
wapp_intern i32 *array = NULL; wp_intern i32 *array = NULL;
wapp_intern Arena *buf_arena = NULL; wp_intern WpArena *buf_arena = NULL;
wapp_intern u8 buf[ARENA_BUF_SIZE] = {0}; wp_intern u8 buf[ARENA_BUF_SIZE] = {0};
wapp_intern Arena *temp_arena = NULL; wp_intern WpArena *temp_arena = NULL;
wapp_intern u8 temp_buf[TEMP_BUF_SIZE] = {0}; wp_intern u8 temp_buf[TEMP_BUF_SIZE] = {0};
TestFuncResult test_arena_init_buffer(void) { WpTestFuncResult test_arena_init_buffer(void) {
b8 result = wapp_mem_arena_init_buffer(&buf_arena, buf, ARENA_BUF_SIZE); b8 result = wpMemArenaInitBuffer(&buf_arena, buf, ARENA_BUF_SIZE);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_init_allocated(void) { WpTestFuncResult test_arena_init_allocated(void) {
b8 result = wapp_mem_arena_init_allocated(&arena, ARENA_CAPACITY); b8 result = wpMemArenaInitAllocated(&arena, ARENA_CAPACITY);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_init_succeeds_when_reserving_very_large_size(void) { WpTestFuncResult test_arena_init_succeeds_when_reserving_very_large_size(void) {
Arena *large_arena = NULL; WpArena *large_arena = NULL;
u64 capacity = GiB(512); u64 capacity = GiB(512);
b8 result = wapp_mem_arena_init_allocated(&large_arena, capacity); b8 result = wpMemArenaInitAllocated(&large_arena, capacity);
if (result) { if (result) {
wapp_mem_arena_destroy(&large_arena); wpMemArenaDestroy(&large_arena);
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_alloc_with_buffer(void) { WpTestFuncResult test_arena_alloc_with_buffer(void) {
i32 *arr = (i32 *)wapp_mem_arena_alloc(arena, count * sizeof(i32)); i32 *arr = (i32 *)wpMemArenaAlloc(arena, count * sizeof(i32));
b8 result = arr != NULL; b8 result = arr != NULL;
for (i32 i = 0; i < count; ++i) { for (i32 i = 0; i < count; ++i) {
arr[i] = i * 10; arr[i] = i * 10;
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_alloc_succeeds_when_within_capacity(void) { WpTestFuncResult test_arena_alloc_succeeds_when_within_capacity(void) {
array = wapp_mem_arena_alloc(arena, count * sizeof(i32)); array = wpMemArenaAlloc(arena, count * sizeof(i32));
b8 result = array != NULL; b8 result = array != NULL;
for (i32 i = 0; i < count; ++i) { for (i32 i = 0; i < count; ++i) {
array[i] = i * 10; array[i] = i * 10;
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_alloc_fails_when_over_capacity(void) { WpTestFuncResult test_arena_alloc_fails_when_over_capacity(void) {
u8 *bytes = wapp_mem_arena_alloc(arena, ARENA_CAPACITY * 2); u8 *bytes = wpMemArenaAlloc(arena, ARENA_CAPACITY * 2);
b8 result = bytes == NULL; b8 result = bytes == NULL;
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_realloc_bigger_size(void) { WpTestFuncResult test_arena_realloc_bigger_size(void) {
u64 old_count = 10; u64 old_count = 10;
u64 new_count = 20; u64 new_count = 20;
i32 *bytes = wapp_mem_arena_alloc(arena, old_count * sizeof(i32)); i32 *bytes = wpMemArenaAlloc(arena, old_count * sizeof(i32));
for (u64 i = 0; i < old_count; ++i) { for (u64 i = 0; i < old_count; ++i) {
bytes[i] = (i32)i; bytes[i] = (i32)i;
} }
i32 *new_bytes = wapp_mem_arena_realloc(arena, bytes, old_count * sizeof(i32), new_count * sizeof(i32)); i32 *new_bytes = wpMemArenaRealloc(arena, bytes, old_count * sizeof(i32), new_count * sizeof(i32));
if (!new_bytes) { if (!new_bytes) {
return wapp_tester_result(false); return wpTesterResult(false);
} }
for (u64 i = 0; i < new_count; ++i) { for (u64 i = 0; i < new_count; ++i) {
if (i < old_count && new_bytes[i] != bytes[i]) { if (i < old_count && new_bytes[i] != bytes[i]) {
return wapp_tester_result(false); return wpTesterResult(false);
} }
} }
return wapp_tester_result(true); return wpTesterResult(true);
} }
TestFuncResult test_arena_realloc_smaller_size(void) { WpTestFuncResult test_arena_realloc_smaller_size(void) {
u64 old_count = 10; u64 old_count = 10;
u64 new_count = 5; u64 new_count = 5;
i32 *bytes = wapp_mem_arena_alloc(arena, old_count * sizeof(i32)); i32 *bytes = wpMemArenaAlloc(arena, old_count * sizeof(i32));
for (u64 i = 0; i < old_count; ++i) { for (u64 i = 0; i < old_count; ++i) {
bytes[i] = (i32)i; bytes[i] = (i32)i;
} }
i32 *new_bytes = wapp_mem_arena_realloc(arena, bytes, old_count * sizeof(i32), new_count * sizeof(i32)); i32 *new_bytes = wpMemArenaRealloc(arena, bytes, old_count * sizeof(i32), new_count * sizeof(i32));
if (!new_bytes) { if (!new_bytes) {
return wapp_tester_result(false); return wpTesterResult(false);
} }
for (u64 i = 0; i < new_count; ++i) { for (u64 i = 0; i < new_count; ++i) {
if (i < new_count && new_bytes[i] != bytes[i]) { if (i < new_count && new_bytes[i] != bytes[i]) {
return wapp_tester_result(false); return wpTesterResult(false);
} }
} }
return wapp_tester_result(true); return wpTesterResult(true);
} }
TestFuncResult test_arena_temp_begin(void) { WpTestFuncResult test_arena_temp_begin(void) {
b8 result = wapp_mem_arena_init_buffer(&temp_arena, temp_buf, TEMP_BUF_SIZE); b8 result = wpMemArenaInitBuffer(&temp_arena, temp_buf, TEMP_BUF_SIZE);
i32 *num1 = (i32 *)wapp_mem_arena_alloc(temp_arena, sizeof(i32)); i32 *num1 = (i32 *)wpMemArenaAlloc(temp_arena, sizeof(i32));
result = result && num1 != NULL; result = result && num1 != NULL;
wapp_mem_arena_temp_begin(temp_arena); wpMemArenaTempBegin(temp_arena);
i32 *num2 = (i32 *)wapp_mem_arena_alloc(temp_arena, sizeof(i32)); i32 *num2 = (i32 *)wpMemArenaAlloc(temp_arena, sizeof(i32));
result = result && num2 != NULL; result = result && num2 != NULL;
i32 *num3 = (i32 *)wapp_mem_arena_alloc(temp_arena, sizeof(i32)); i32 *num3 = (i32 *)wpMemArenaAlloc(temp_arena, sizeof(i32));
result = result && num3 == NULL; result = result && num3 == NULL;
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_temp_end(void) { WpTestFuncResult test_arena_temp_end(void) {
wapp_mem_arena_temp_end(temp_arena); wpMemArenaTempEnd(temp_arena);
i32 *num1 = (i32 *)wapp_mem_arena_alloc(temp_arena, sizeof(i32)); i32 *num1 = (i32 *)wpMemArenaAlloc(temp_arena, sizeof(i32));
b8 result = num1 != NULL; b8 result = num1 != NULL;
i32 *num2 = (i32 *)wapp_mem_arena_alloc(temp_arena, sizeof(i32)); i32 *num2 = (i32 *)wpMemArenaAlloc(temp_arena, sizeof(i32));
result = result && num2 == NULL; result = result && num2 == NULL;
wapp_mem_arena_destroy(&temp_arena); wpMemArenaDestroy(&temp_arena);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_clear(void) { WpTestFuncResult test_arena_clear(void) {
wapp_mem_arena_clear(arena); wpMemArenaClear(arena);
b8 result = true; b8 result = true;
for (i32 i = 0; i < count; ++i) { for (i32 i = 0; i < count; ++i) {
@@ -150,19 +150,19 @@ TestFuncResult test_arena_clear(void) {
} }
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_destroy_buffer(void) { WpTestFuncResult test_arena_destroy_buffer(void) {
wapp_mem_arena_destroy(&buf_arena); wpMemArenaDestroy(&buf_arena);
b8 result = buf_arena == NULL; b8 result = buf_arena == NULL;
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_destroy_allocated(void) { WpTestFuncResult test_arena_destroy_allocated(void) {
wapp_mem_arena_destroy(&arena); wpMemArenaDestroy(&arena);
b8 result = arena == NULL; b8 result = arena == NULL;
return wapp_tester_result(result); return wpTesterResult(result);
} }
+62 -62
View File
@@ -4,143 +4,143 @@
#define ARENA_CAPACITY KiB(16) #define ARENA_CAPACITY KiB(16)
#define ARENA_BUF_SIZE KiB(4) #define ARENA_BUF_SIZE KiB(4)
// NOTE (Abdelrahman): Cannot query size of Arena here so it's hardcoded. Similarly, since arena // NOTE (Abdelrahman): Cannot query size of WpArena here so it's hardcoded. Similarly, since arena
// allocation are aligned to power of 2 boundaries, the number of i32 values needed is hardcoded. // allocation are aligned to power of 2 boundaries, the number of i32 values needed is hardcoded.
#define TEMP_BUF_SIZE (40 + sizeof(i32) * 8) #define TEMP_BUF_SIZE (40 + sizeof(i32) * 8)
wapp_intern Arena *arena = NULL; wp_intern WpArena *arena = NULL;
wapp_intern i32 count = 20; wp_intern i32 count = 20;
wapp_intern i32 *array = NULL; wp_intern i32 *array = NULL;
wapp_intern Arena *buf_arena = NULL; wp_intern WpArena *buf_arena = NULL;
wapp_intern u8 buf[ARENA_BUF_SIZE] = {}; wp_intern u8 buf[ARENA_BUF_SIZE] = {};
wapp_intern Arena *temp_arena = NULL; wp_intern WpArena *temp_arena = NULL;
wapp_intern u8 temp_buf[TEMP_BUF_SIZE] = {}; wp_intern u8 temp_buf[TEMP_BUF_SIZE] = {};
TestFuncResult test_arena_init_buffer(void) { WpTestFuncResult test_arena_init_buffer(void) {
b8 result = wapp_mem_arena_init_buffer(&buf_arena, buf, ARENA_BUF_SIZE); b8 result = wpMemArenaInitBuffer(&buf_arena, buf, ARENA_BUF_SIZE);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_init_allocated(void) { WpTestFuncResult test_arena_init_allocated(void) {
b8 result = wapp_mem_arena_init_allocated(&arena, ARENA_CAPACITY); b8 result = wpMemArenaInitAllocated(&arena, ARENA_CAPACITY);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_init_succeeds_when_reserving_very_large_size(void) { WpTestFuncResult test_arena_init_succeeds_when_reserving_very_large_size(void) {
Arena *large_arena = nullptr; WpArena *large_arena = nullptr;
u64 capacity = GiB(512); u64 capacity = GiB(512);
b8 result = wapp_mem_arena_init_allocated(&large_arena, capacity); b8 result = wpMemArenaInitAllocated(&large_arena, capacity);
if (result) { if (result) {
wapp_mem_arena_destroy(&large_arena); wpMemArenaDestroy(&large_arena);
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_alloc_with_buffer(void) { WpTestFuncResult test_arena_alloc_with_buffer(void) {
i32 *arr = (i32 *)wapp_mem_arena_alloc(arena, count * sizeof(i32)); i32 *arr = (i32 *)wpMemArenaAlloc(arena, count * sizeof(i32));
b8 result = arr != NULL; b8 result = arr != NULL;
for (i32 i = 0; i < count; ++i) { for (i32 i = 0; i < count; ++i) {
arr[i] = i * 10; arr[i] = i * 10;
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_alloc_succeeds_when_within_capacity(void) { WpTestFuncResult test_arena_alloc_succeeds_when_within_capacity(void) {
array = (i32 *)wapp_mem_arena_alloc(arena, count * sizeof(i32)); array = (i32 *)wpMemArenaAlloc(arena, count * sizeof(i32));
b8 result = array != nullptr; b8 result = array != nullptr;
for (i32 i = 0; i < count; ++i) { for (i32 i = 0; i < count; ++i) {
array[i] = i * 10; array[i] = i * 10;
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_alloc_fails_when_over_capacity(void) { WpTestFuncResult test_arena_alloc_fails_when_over_capacity(void) {
u8 *bytes = (u8 *)wapp_mem_arena_alloc(arena, ARENA_CAPACITY * 2); u8 *bytes = (u8 *)wpMemArenaAlloc(arena, ARENA_CAPACITY * 2);
b8 result = bytes == nullptr; b8 result = bytes == nullptr;
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_realloc_bigger_size(void) { WpTestFuncResult test_arena_realloc_bigger_size(void) {
u64 old_count = 10; u64 old_count = 10;
u64 new_count = 20; u64 new_count = 20;
i32 *bytes = (i32 *)wapp_mem_arena_alloc(arena, old_count * sizeof(i32)); i32 *bytes = (i32 *)wpMemArenaAlloc(arena, old_count * sizeof(i32));
for (u64 i = 0; i < old_count; ++i) { for (u64 i = 0; i < old_count; ++i) {
bytes[i] = (i32)i; bytes[i] = (i32)i;
} }
i32 *new_bytes = (i32 *)wapp_mem_arena_realloc(arena, bytes, old_count * sizeof(i32), new_count * sizeof(i32)); i32 *new_bytes = (i32 *)wpMemArenaRealloc(arena, bytes, old_count * sizeof(i32), new_count * sizeof(i32));
if (!new_bytes) { if (!new_bytes) {
return wapp_tester_result(false); return wpTesterResult(false);
} }
for (u64 i = 0; i < new_count; ++i) { for (u64 i = 0; i < new_count; ++i) {
if (i < old_count && new_bytes[i] != bytes[i]) { if (i < old_count && new_bytes[i] != bytes[i]) {
return wapp_tester_result(false); return wpTesterResult(false);
} }
} }
return wapp_tester_result(true); return wpTesterResult(true);
} }
TestFuncResult test_arena_realloc_smaller_size(void) { WpTestFuncResult test_arena_realloc_smaller_size(void) {
u64 old_count = 10; u64 old_count = 10;
u64 new_count = 5; u64 new_count = 5;
i32 *bytes = (i32 *)wapp_mem_arena_alloc(arena, old_count * sizeof(i32)); i32 *bytes = (i32 *)wpMemArenaAlloc(arena, old_count * sizeof(i32));
for (u64 i = 0; i < old_count; ++i) { for (u64 i = 0; i < old_count; ++i) {
bytes[i] = (i32)i; bytes[i] = (i32)i;
} }
i32 *new_bytes = (i32 *)wapp_mem_arena_realloc(arena, bytes, old_count * sizeof(i32), new_count * sizeof(i32)); i32 *new_bytes = (i32 *)wpMemArenaRealloc(arena, bytes, old_count * sizeof(i32), new_count * sizeof(i32));
if (!new_bytes) { if (!new_bytes) {
return wapp_tester_result(false); return wpTesterResult(false);
} }
for (u64 i = 0; i < new_count; ++i) { for (u64 i = 0; i < new_count; ++i) {
if (i < new_count && new_bytes[i] != bytes[i]) { if (i < new_count && new_bytes[i] != bytes[i]) {
return wapp_tester_result(false); return wpTesterResult(false);
} }
} }
return wapp_tester_result(true); return wpTesterResult(true);
} }
TestFuncResult test_arena_temp_begin(void) { WpTestFuncResult test_arena_temp_begin(void) {
b8 result = wapp_mem_arena_init_buffer(&temp_arena, temp_buf, TEMP_BUF_SIZE); b8 result = wpMemArenaInitBuffer(&temp_arena, temp_buf, TEMP_BUF_SIZE);
i32 *num1 = (i32 *)wapp_mem_arena_alloc(temp_arena, sizeof(i32)); i32 *num1 = (i32 *)wpMemArenaAlloc(temp_arena, sizeof(i32));
result = result && num1 != NULL; result = result && num1 != NULL;
wapp_mem_arena_temp_begin(temp_arena); wpMemArenaTempBegin(temp_arena);
i32 *num2 = (i32 *)wapp_mem_arena_alloc(temp_arena, sizeof(i32)); i32 *num2 = (i32 *)wpMemArenaAlloc(temp_arena, sizeof(i32));
result = result && num2 != NULL; result = result && num2 != NULL;
i32 *num3 = (i32 *)wapp_mem_arena_alloc(temp_arena, sizeof(i32)); i32 *num3 = (i32 *)wpMemArenaAlloc(temp_arena, sizeof(i32));
result = result && num3 == NULL; result = result && num3 == NULL;
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_temp_end(void) { WpTestFuncResult test_arena_temp_end(void) {
wapp_mem_arena_temp_end(temp_arena); wpMemArenaTempEnd(temp_arena);
i32 *num1 = (i32 *)wapp_mem_arena_alloc(temp_arena, sizeof(i32)); i32 *num1 = (i32 *)wpMemArenaAlloc(temp_arena, sizeof(i32));
b8 result = num1 != NULL; b8 result = num1 != NULL;
i32 *num2 = (i32 *)wapp_mem_arena_alloc(temp_arena, sizeof(i32)); i32 *num2 = (i32 *)wpMemArenaAlloc(temp_arena, sizeof(i32));
result = result && num2 == NULL; result = result && num2 == NULL;
wapp_mem_arena_destroy(&temp_arena); wpMemArenaDestroy(&temp_arena);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_clear(void) { WpTestFuncResult test_arena_clear(void) {
wapp_mem_arena_clear(arena); wpMemArenaClear(arena);
b8 result = true; b8 result = true;
for (i32 i = 0; i < count; ++i) { for (i32 i = 0; i < count; ++i) {
@@ -150,19 +150,19 @@ TestFuncResult test_arena_clear(void) {
} }
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_destroy_buffer(void) { WpTestFuncResult test_arena_destroy_buffer(void) {
wapp_mem_arena_destroy(&buf_arena); wpMemArenaDestroy(&buf_arena);
b8 result = buf_arena == NULL; b8 result = buf_arena == NULL;
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_arena_destroy_allocated(void) { WpTestFuncResult test_arena_destroy_allocated(void) {
wapp_mem_arena_destroy(&arena); wpMemArenaDestroy(&arena);
b8 result = arena == nullptr; b8 result = arena == nullptr;
return wapp_tester_result(result); return wpTesterResult(result);
} }
+13 -13
View File
@@ -3,18 +3,18 @@
#include "wapp.h" #include "wapp.h"
TestFuncResult test_arena_init_buffer(void); WpTestFuncResult test_arena_init_buffer(void);
TestFuncResult test_arena_init_allocated(void); WpTestFuncResult test_arena_init_allocated(void);
TestFuncResult test_arena_init_succeeds_when_reserving_very_large_size(void); WpTestFuncResult test_arena_init_succeeds_when_reserving_very_large_size(void);
TestFuncResult test_arena_alloc_with_buffer(void); WpTestFuncResult test_arena_alloc_with_buffer(void);
TestFuncResult test_arena_alloc_succeeds_when_within_capacity(void); WpTestFuncResult test_arena_alloc_succeeds_when_within_capacity(void);
TestFuncResult test_arena_alloc_fails_when_over_capacity(void); WpTestFuncResult test_arena_alloc_fails_when_over_capacity(void);
TestFuncResult test_arena_realloc_bigger_size(void); WpTestFuncResult test_arena_realloc_bigger_size(void);
TestFuncResult test_arena_realloc_smaller_size(void); WpTestFuncResult test_arena_realloc_smaller_size(void);
TestFuncResult test_arena_clear(void); WpTestFuncResult test_arena_clear(void);
TestFuncResult test_arena_temp_begin(void); WpTestFuncResult test_arena_temp_begin(void);
TestFuncResult test_arena_temp_end(void); WpTestFuncResult test_arena_temp_end(void);
TestFuncResult test_arena_destroy_buffer(void); WpTestFuncResult test_arena_destroy_buffer(void);
TestFuncResult test_arena_destroy_allocated(void); WpTestFuncResult test_arena_destroy_allocated(void);
#endif // !TEST_ARENA_H #endif // !TEST_ARENA_H
+112 -99
View File
@@ -1,172 +1,172 @@
#include "test_i32_array.h" #include "test_i32_array.h"
#include "wapp.h" #include "wapp.h"
TestFuncResult test_i32_array(void) { WpTestFuncResult test_i32_array(void) {
b8 result; b8 result;
I32Array array = wapp_array(i32, 1, 2, 3, 4, 5, 6, 7); WpI32Array array = wpArray(i32, 1, 2, 3, 4, 5, 6, 7);
result = wapp_array_count(array) == 7 && wapp_array_capacity(array) == 16; result = wpArrayCount(array) == 7 && wpArrayCapacity(array) == 16;
i32 *item; i32 *item;
u64 count = wapp_array_count(array); u64 count = wpArrayCount(array);
u64 index = 0; u64 index = 0;
b8 running = true; b8 running = true;
while (running) { while (running) {
item = wapp_array_get(i32, array, index); item = wpArrayGet(i32, array, index);
result = result && item && *item == (i32)(index + 1); result = result && item && *item == (i32)(index + 1);
++index; ++index;
running = index < count; running = index < count;
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_with_capacity(void) { WpTestFuncResult test_i32_array_with_capacity(void) {
b8 result; b8 result;
I32Array array1 = wapp_array_with_capacity(i32, 64, ARRAY_INIT_NONE); WpI32Array array1 = wpArrayWithCapacity(i32, 64, WP_ARRAY_INIT_NONE);
result = wapp_array_count(array1) == 0 && wapp_array_capacity(array1) == 64; result = wpArrayCount(array1) == 0 && wpArrayCapacity(array1) == 64;
I32Array array2 = wapp_array_with_capacity(i32, 64, ARRAY_INIT_FILLED); WpI32Array array2 = wpArrayWithCapacity(i32, 64, WP_ARRAY_INIT_FILLED);
result = wapp_array_count(array2) == 64 && wapp_array_capacity(array2) == 64; result = wpArrayCount(array2) == 64 && wpArrayCapacity(array2) == 64;
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_get(void) { WpTestFuncResult test_i32_array_get(void) {
b8 result = true; b8 result = true;
I32Array array = wapp_array(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8); WpI32Array array = wpArray(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8);
i32 *item; i32 *item;
u64 count = wapp_array_count(array); u64 count = wpArrayCount(array);
u64 index = 0; u64 index = 0;
b8 running = true; b8 running = true;
while (running) { while (running) {
item = wapp_array_get(i32, array, index); item = wpArrayGet(i32, array, index);
result = result && item && *item == (i32)index; result = result && item && *item == (i32)index;
++index; ++index;
running = index < count; running = index < count;
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_set(void) { WpTestFuncResult test_i32_array_set(void) {
b8 result = true; b8 result = true;
I32Array array = wapp_array(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8); WpI32Array array = wpArray(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8);
i32 *item; i32 *item;
u64 count = wapp_array_count(array); u64 count = wpArrayCount(array);
u64 index = 0; u64 index = 0;
b8 running = true; b8 running = true;
while (running) { while (running) {
i32 num = (i32)(index * 2); i32 num = (i32)(index * 2);
wapp_array_set(i32, array, index, &num); wpArraySet(i32, array, index, &num);
item = wapp_array_get(i32, array, index); item = wpArrayGet(i32, array, index);
result = result && item && *item == (i32)(index * 2); result = result && item && *item == (i32)(index * 2);
++index; ++index;
running = index < count; running = index < count;
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_append_capped(void) { WpTestFuncResult test_i32_array_append_capped(void) {
b8 result; b8 result;
I32Array array = wapp_array_with_capacity(i32, 64, ARRAY_INIT_NONE); WpI32Array array = wpArrayWithCapacity(i32, 64, WP_ARRAY_INIT_NONE);
wapp_array_append_capped(i32, array, &((i32){10})); wpArrayAppendCapped(i32, array, &((i32){10}));
result = wapp_array_count(array) == 1; result = wpArrayCount(array) == 1;
i32 *item = wapp_array_get(i32, array, 0); i32 *item = wpArrayGet(i32, array, 0);
result = result && item && *item == 10; result = result && item && *item == 10;
array = wapp_array(i32, 1); array = wpArray(i32, 1);
wapp_array_append_capped(i32, array, &((i32){10})); wpArrayAppendCapped(i32, array, &((i32){10}));
result = result && wapp_array_count(array) == 2; result = result && wpArrayCount(array) == 2;
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_extend_capped(void) { WpTestFuncResult test_i32_array_extend_capped(void) {
b8 result; b8 result;
I32Array array1 = wapp_array(i32, 1, 2, 3, 4); WpI32Array array1 = wpArray(i32, 1, 2, 3, 4);
I32Array array2 = wapp_array(i32, 10, 20); WpI32Array array2 = wpArray(i32, 10, 20);
result = wapp_array_count(array1) == 4 && wapp_array_count(array2) == 2; result = wpArrayCount(array1) == 4 && wpArrayCount(array2) == 2;
wapp_array_extend_capped(i32, array1, array2); wpArrayExtendCapped(i32, array1, array2);
result = result && wapp_array_count(array1) == 6; result = result && wpArrayCount(array1) == 6;
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_copy_capped(void) { WpTestFuncResult test_i32_array_copy_capped(void) {
b8 result; b8 result;
I32Array src = wapp_array(i32, 1, 2, 3, 4, 5); WpI32Array src = wpArray(i32, 1, 2, 3, 4, 5);
I32Array dst1 = wapp_array(i32, 1, 2, 3, 4, 5, 6); WpI32Array dst1 = wpArray(i32, 1, 2, 3, 4, 5, 6);
I32Array dst2 = wapp_array(i32, 1, 2); WpI32Array dst2 = wpArray(i32, 1, 2);
u64 expected_count = 5; u64 expected_count = 5;
wapp_array_copy_capped(i32, dst1, src); wpArrayCopyCapped(i32, dst1, src);
result = wapp_array_count(dst1) == expected_count; result = wpArrayCount(dst1) == expected_count;
u64 index = 0; u64 index = 0;
b8 running = true; b8 running = true;
while (running) { while (running) {
result = result && *wapp_array_get(i32, src, index) == *wapp_array_get(i32, dst1, index); result = result && *wpArrayGet(i32, src, index) == *wpArrayGet(i32, dst1, index);
++index; ++index;
running = index < expected_count; running = index < expected_count;
} }
expected_count = 4; expected_count = 4;
wapp_array_copy_capped(i32, dst2, src); wpArrayCopyCapped(i32, dst2, src);
result = result && wapp_array_count(dst2) == expected_count; result = result && wpArrayCount(dst2) == expected_count;
index = 0; index = 0;
running = true; running = true;
while (running) { while (running) {
result = result && *wapp_array_get(i32, src, index) == *wapp_array_get(i32, dst2, index); result = result && *wpArrayGet(i32, src, index) == *wpArrayGet(i32, dst2, index);
++index; ++index;
running = index < expected_count; running = index < expected_count;
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_alloc_capacity(void) { WpTestFuncResult test_i32_array_alloc_capacity(void) {
b8 result; b8 result;
Allocator allocator = wapp_mem_arena_allocator_init(MiB(4)); WpAllocator allocator = wpMemArenaAllocatorInit(MiB(4));
u64 capacity = 32; u64 capacity = 32;
I32Array array = wapp_array_alloc_capacity(i32, &allocator, capacity, ARRAY_INIT_NONE); WpI32Array array = wpArrayAllocCapacity(i32, &allocator, capacity, WP_ARRAY_INIT_NONE);
result = array && wapp_array_capacity(array) == capacity; result = array && wpArrayCapacity(array) == capacity;
wapp_mem_arena_allocator_destroy(&allocator); wpMemArenaAllocatorDestroy(&allocator);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_append_alloc(void) { WpTestFuncResult test_i32_array_append_alloc(void) {
b8 result; b8 result;
Allocator allocator = wapp_mem_arena_allocator_init(MiB(4)); WpAllocator allocator = wpMemArenaAllocatorInit(MiB(4));
I32Array array1 = wapp_array(i32, 1, 2, 3, 4, 5, 6, 7, 8); WpI32Array array1 = wpArray(i32, 1, 2, 3, 4, 5, 6, 7, 8);
I32Array array2 = wapp_array(i32, 1, 2); WpI32Array array2 = wpArray(i32, 1, 2);
I32Array arr_ptr = wapp_array_append_alloc(i32, &allocator, array1, &((i32){10}), ARRAY_INIT_NONE); WpI32Array arr_ptr = wpArrayAppendAlloc(i32, &allocator, array1, &((i32){10}), WP_ARRAY_INIT_NONE);
result = arr_ptr == array1; result = arr_ptr == array1;
u64 count = 4; u64 count = 4;
@@ -174,100 +174,113 @@ TestFuncResult test_i32_array_append_alloc(void) {
b8 running = true; b8 running = true;
while (running) { while (running) {
i32 num = (i32)index; i32 num = (i32)index;
arr_ptr = wapp_array_append_alloc(i32, &allocator, array2, &num, ARRAY_INIT_NONE); arr_ptr = wpArrayAppendAlloc(i32, &allocator, array2, &num, WP_ARRAY_INIT_NONE);
++index; ++index;
running = index < count; running = index < count;
} }
result = result && arr_ptr != array2; result = result && arr_ptr != array2;
wapp_mem_arena_allocator_destroy(&allocator); wpMemArenaAllocatorDestroy(&allocator);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_extend_alloc(void) { WpTestFuncResult test_i32_array_extend_alloc(void) {
b8 result; b8 result;
Allocator allocator = wapp_mem_arena_allocator_init(MiB(4)); WpAllocator allocator = wpMemArenaAllocatorInit(MiB(4));
I32Array array1 = wapp_array(i32, 1, 2, 3, 4, 5, 6, 7, 8); WpI32Array array1 = wpArray(i32, 1, 2, 3, 4, 5, 6, 7, 8);
I32Array array2 = wapp_array(i32, 1, 2); WpI32Array array2 = wpArray(i32, 1, 2);
I32Array array3 = wapp_array(i32, 1, 2, 3, 4); WpI32Array array3 = wpArray(i32, 1, 2, 3, 4);
I32Array arr_ptr = wapp_array_extend_alloc(i32, &allocator, array1, array3, ARRAY_INIT_NONE); WpI32Array arr_ptr = wpArrayExtendAlloc(i32, &allocator, array1, array3, WP_ARRAY_INIT_NONE);
result = arr_ptr == array1; result = arr_ptr == array1;
arr_ptr = wapp_array_extend_alloc(i32, &allocator, array2, array3, ARRAY_INIT_NONE); arr_ptr = wpArrayExtendAlloc(i32, &allocator, array2, array3, WP_ARRAY_INIT_NONE);
result = result && arr_ptr != array2; result = result && arr_ptr != array2;
wapp_mem_arena_allocator_destroy(&allocator); wpMemArenaAllocatorDestroy(&allocator);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_copy_alloc(void) { WpTestFuncResult test_i32_array_copy_alloc(void) {
b8 result; b8 result;
Allocator allocator = wapp_mem_arena_allocator_init(MiB(4)); WpAllocator allocator = wpMemArenaAllocatorInit(MiB(4));
I32Array src = wapp_array(i32, 1, 2, 3, 4, 5); WpI32Array src = wpArray(i32, 1, 2, 3, 4, 5);
I32Array dst1 = wapp_array(i32, 1, 2, 3, 4, 5, 6); WpI32Array dst1 = wpArray(i32, 1, 2, 3, 4, 5, 6);
I32Array dst2 = wapp_array(i32, 1, 2); WpI32Array dst2 = wpArray(i32, 1, 2);
I32Array array = NULL; WpI32Array array = NULL;
u64 expected_count = 5; u64 expected_count = 5;
array = wapp_array_copy_alloc(i32, &allocator, dst1, src, ARRAY_INIT_NONE); array = wpArrayCopyAlloc(i32, &allocator, dst1, src, WP_ARRAY_INIT_NONE);
result = wapp_array_count(array) == expected_count && array == dst1; result = wpArrayCount(array) == expected_count && array == dst1;
u64 index = 0; u64 index = 0;
b8 running = true; b8 running = true;
while (running) { while (running) {
result = result && *wapp_array_get(i32, src, index) == *wapp_array_get(i32, array, index); result = result && *wpArrayGet(i32, src, index) == *wpArrayGet(i32, array, index);
++index; ++index;
running = index < expected_count; running = index < expected_count;
} }
expected_count = 5; expected_count = 5;
array = wapp_array_copy_alloc(i32, &allocator, dst2, src, ARRAY_INIT_NONE); array = wpArrayCopyAlloc(i32, &allocator, dst2, src, WP_ARRAY_INIT_NONE);
result = result && wapp_array_count(array) == expected_count && array != dst2; result = result && wpArrayCount(array) == expected_count && array != dst2;
index = 0; index = 0;
running = true; running = true;
while (running) { while (running) {
result = result && *wapp_array_get(i32, src, index) == *wapp_array_get(i32, array, index); result = result && *wpArrayGet(i32, src, index) == *wpArrayGet(i32, array, index);
++index; ++index;
running = index < expected_count; running = index < expected_count;
} }
wapp_mem_arena_allocator_destroy(&allocator); wpMemArenaAllocatorDestroy(&allocator);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_pop(void) { WpTestFuncResult test_i32_array_remove_swap_end(void) {
b8 result; b8 result;
I32Array array1 = wapp_array(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8); WpI32Array array = wpArray(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8);
I32Array array2 = wapp_array_with_capacity(i32, 32, ARRAY_INIT_NONE); result = wpArrayCount(array) == 9 && array[4] == 4;
i32 item1 = wapp_array_pop(i32, array1); wpArrayRemoveSwapEnd(i32, array, 4);
i32 item2 = wapp_array_pop(i32, array2);
result = result && wpArrayCount(array) == 8 && array[4] == 8;
return wpTesterResult(result);
}
WpTestFuncResult test_i32_array_pop(void) {
b8 result;
WpI32Array array1 = wpArray(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8);
WpI32Array array2 = wpArrayWithCapacity(i32, 32, WP_ARRAY_INIT_NONE);
i32 item1 = wpArrayPop(i32, array1);
i32 item2 = wpArrayPop(i32, array2);
result = item1 == 8 && item2 == 0; result = item1 == 8 && item2 == 0;
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_clear(void) { WpTestFuncResult test_i32_array_clear(void) {
b8 result; b8 result;
I32Array array = wapp_array(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8); WpI32Array array = wpArray(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8);
result = wapp_array_count(array) == 9; result = wpArrayCount(array) == 9;
wapp_array_clear(i32, array); wpArrayClear(i32, array);
result = result && wapp_array_count(array) == 0; result = result && wpArrayCount(array) == 0;
return wapp_tester_result(result); return wpTesterResult(result);
} }
+112 -99
View File
@@ -1,175 +1,175 @@
#include "test_i32_array.h" #include "test_i32_array.h"
#include "wapp.h" #include "wapp.h"
TestFuncResult test_i32_array(void) { WpTestFuncResult test_i32_array(void) {
b8 result; b8 result;
I32Array array = wapp_array(i32, 1, 2, 3, 4, 5, 6, 7); WpI32Array array = wpArray(i32, 1, 2, 3, 4, 5, 6, 7);
result = wapp_array_count(array) == 7 && wapp_array_capacity(array) == 16; result = wpArrayCount(array) == 7 && wpArrayCapacity(array) == 16;
i32 *item; i32 *item;
u64 count = wapp_array_count(array); u64 count = wpArrayCount(array);
u64 index = 0; u64 index = 0;
b8 running = true; b8 running = true;
while (running) { while (running) {
item = wapp_array_get(i32, array, index); item = wpArrayGet(i32, array, index);
result = result && item && (*item == (i32)(index + 1)); result = result && item && (*item == (i32)(index + 1));
++index; ++index;
running = index < count; running = index < count;
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_with_capacity(void) { WpTestFuncResult test_i32_array_with_capacity(void) {
b8 result; b8 result;
I32Array array1 = wapp_array_with_capacity(i32, 64, ARRAY_INIT_NONE); WpI32Array array1 = wpArrayWithCapacity(i32, 64, WP_ARRAY_INIT_NONE);
result = wapp_array_count(array1) == 0 && wapp_array_capacity(array1) == 64; result = wpArrayCount(array1) == 0 && wpArrayCapacity(array1) == 64;
I32Array array2 = wapp_array_with_capacity(i32, 64, ARRAY_INIT_FILLED); WpI32Array array2 = wpArrayWithCapacity(i32, 64, WP_ARRAY_INIT_FILLED);
result = wapp_array_count(array2) == 64 && wapp_array_capacity(array2) == 64; result = wpArrayCount(array2) == 64 && wpArrayCapacity(array2) == 64;
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_get(void) { WpTestFuncResult test_i32_array_get(void) {
b8 result = true; b8 result = true;
I32Array array = wapp_array(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8); WpI32Array array = wpArray(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8);
i32 *item; i32 *item;
u64 count = wapp_array_count(array); u64 count = wpArrayCount(array);
u64 index = 0; u64 index = 0;
b8 running = true; b8 running = true;
while (running) { while (running) {
item = wapp_array_get(i32, array, index); item = wpArrayGet(i32, array, index);
result = result && item && (*item == (i32)index); result = result && item && (*item == (i32)index);
++index; ++index;
running = index < count; running = index < count;
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_set(void) { WpTestFuncResult test_i32_array_set(void) {
b8 result = true; b8 result = true;
I32Array array = wapp_array(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8); WpI32Array array = wpArray(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8);
i32 *item; i32 *item;
u64 count = wapp_array_count(array); u64 count = wpArrayCount(array);
u64 index = 0; u64 index = 0;
b8 running = true; b8 running = true;
while (running) { while (running) {
i32 num = (i32)(index * 2); i32 num = (i32)(index * 2);
wapp_array_set(i32, array, index, &num); wpArraySet(i32, array, index, &num);
item = wapp_array_get(i32, array, index); item = wpArrayGet(i32, array, index);
result = result && item && (*item == (i32)(index * 2)); result = result && item && (*item == (i32)(index * 2));
++index; ++index;
running = index < count; running = index < count;
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_append_capped(void) { WpTestFuncResult test_i32_array_append_capped(void) {
b8 result; b8 result;
I32Array array = wapp_array_with_capacity(i32, 64, ARRAY_INIT_NONE); WpI32Array array = wpArrayWithCapacity(i32, 64, WP_ARRAY_INIT_NONE);
i32 item1 = 10; i32 item1 = 10;
wapp_array_append_capped(i32, array, &item1); wpArrayAppendCapped(i32, array, &item1);
result = wapp_array_count(array) == 1; result = wpArrayCount(array) == 1;
i32 *item = wapp_array_get(i32, array, 0); i32 *item = wpArrayGet(i32, array, 0);
result = result && item && *item == 10; result = result && item && *item == 10;
array = wapp_array(i32, 1); array = wpArray(i32, 1);
i32 item2 = 10; i32 item2 = 10;
wapp_array_append_capped(i32, array, &item2); wpArrayAppendCapped(i32, array, &item2);
result = result && wapp_array_count(array) == 2; result = result && wpArrayCount(array) == 2;
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_extend_capped(void) { WpTestFuncResult test_i32_array_extend_capped(void) {
b8 result; b8 result;
I32Array array1 = wapp_array(i32, 1, 2, 3, 4); WpI32Array array1 = wpArray(i32, 1, 2, 3, 4);
I32Array array2 = wapp_array(i32, 10, 20); WpI32Array array2 = wpArray(i32, 10, 20);
result = wapp_array_count(array1) == 4 && wapp_array_count(array2) == 2; result = wpArrayCount(array1) == 4 && wpArrayCount(array2) == 2;
wapp_array_extend_capped(i32, array1, array2); wpArrayExtendCapped(i32, array1, array2);
result = result && wapp_array_count(array1) == 6; result = result && wpArrayCount(array1) == 6;
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_copy_capped(void) { WpTestFuncResult test_i32_array_copy_capped(void) {
b8 result; b8 result;
I32Array src = wapp_array(i32, 1, 2, 3, 4, 5); WpI32Array src = wpArray(i32, 1, 2, 3, 4, 5);
I32Array dst1 = wapp_array(i32, 1, 2, 3, 4, 5, 6); WpI32Array dst1 = wpArray(i32, 1, 2, 3, 4, 5, 6);
I32Array dst2 = wapp_array(i32, 1, 2); WpI32Array dst2 = wpArray(i32, 1, 2);
u64 expected_count = 5; u64 expected_count = 5;
wapp_array_copy_capped(i32, dst1, src); wpArrayCopyCapped(i32, dst1, src);
result = wapp_array_count(dst1) == expected_count; result = wpArrayCount(dst1) == expected_count;
u64 index = 0; u64 index = 0;
b8 running = true; b8 running = true;
while (running) { while (running) {
result = result && (*wapp_array_get(i32, src, index) == *wapp_array_get(i32, dst1, index)); result = result && (*wpArrayGet(i32, src, index) == *wpArrayGet(i32, dst1, index));
++index; ++index;
running = index < expected_count; running = index < expected_count;
} }
expected_count = 4; expected_count = 4;
wapp_array_copy_capped(i32, dst2, src); wpArrayCopyCapped(i32, dst2, src);
result = result && wapp_array_count(dst2) == expected_count; result = result && wpArrayCount(dst2) == expected_count;
index = 0; index = 0;
running = true; running = true;
while (running) { while (running) {
result = result && (*wapp_array_get(i32, src, index) == *wapp_array_get(i32, dst2, index)); result = result && (*wpArrayGet(i32, src, index) == *wpArrayGet(i32, dst2, index));
++index; ++index;
running = index < expected_count; running = index < expected_count;
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_alloc_capacity(void) { WpTestFuncResult test_i32_array_alloc_capacity(void) {
b8 result; b8 result;
Allocator allocator = wapp_mem_arena_allocator_init(MiB(4)); WpAllocator allocator = wpMemArenaAllocatorInit(MiB(4));
u64 capacity = 32; u64 capacity = 32;
I32Array array = wapp_array_alloc_capacity(i32, &allocator, capacity, ARRAY_INIT_NONE); WpI32Array array = wpArrayAllocCapacity(i32, &allocator, capacity, WP_ARRAY_INIT_NONE);
result = array && wapp_array_capacity(array) == capacity; result = array && wpArrayCapacity(array) == capacity;
wapp_mem_arena_allocator_destroy(&allocator); wpMemArenaAllocatorDestroy(&allocator);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_append_alloc(void) { WpTestFuncResult test_i32_array_append_alloc(void) {
b8 result; b8 result;
Allocator allocator = wapp_mem_arena_allocator_init(MiB(4)); WpAllocator allocator = wpMemArenaAllocatorInit(MiB(4));
I32Array array1 = wapp_array(i32, 1, 2, 3, 4, 5, 6, 7, 8); WpI32Array array1 = wpArray(i32, 1, 2, 3, 4, 5, 6, 7, 8);
I32Array array2 = wapp_array(i32, 1, 2); WpI32Array array2 = wpArray(i32, 1, 2);
i32 num = 10; i32 num = 10;
I32Array arr_ptr = wapp_array_append_alloc(i32, &allocator, array1, &num, ARRAY_INIT_NONE); WpI32Array arr_ptr = wpArrayAppendAlloc(i32, &allocator, array1, &num, WP_ARRAY_INIT_NONE);
result = arr_ptr == array1; result = arr_ptr == array1;
u64 count = 4; u64 count = 4;
@@ -177,100 +177,113 @@ TestFuncResult test_i32_array_append_alloc(void) {
b8 running = true; b8 running = true;
while (running) { while (running) {
num = (i32)index; num = (i32)index;
arr_ptr = wapp_array_append_alloc(i32, &allocator, array2, &num, ARRAY_INIT_NONE); arr_ptr = wpArrayAppendAlloc(i32, &allocator, array2, &num, WP_ARRAY_INIT_NONE);
++index; ++index;
running = index < count; running = index < count;
} }
result = result && arr_ptr != array2; result = result && arr_ptr != array2;
wapp_mem_arena_allocator_destroy(&allocator); wpMemArenaAllocatorDestroy(&allocator);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_extend_alloc(void) { WpTestFuncResult test_i32_array_extend_alloc(void) {
b8 result; b8 result;
Allocator allocator = wapp_mem_arena_allocator_init(MiB(4)); WpAllocator allocator = wpMemArenaAllocatorInit(MiB(4));
I32Array array1 = wapp_array(i32, 1, 2, 3, 4, 5, 6, 7, 8); WpI32Array array1 = wpArray(i32, 1, 2, 3, 4, 5, 6, 7, 8);
I32Array array2 = wapp_array(i32, 1, 2); WpI32Array array2 = wpArray(i32, 1, 2);
I32Array array3 = wapp_array(i32, 1, 2, 3, 4); WpI32Array array3 = wpArray(i32, 1, 2, 3, 4);
I32Array array = wapp_array_extend_alloc(i32, &allocator, array1, array3, ARRAY_INIT_NONE); WpI32Array array = wpArrayExtendAlloc(i32, &allocator, array1, array3, WP_ARRAY_INIT_NONE);
result = array == array1; result = array == array1;
array = wapp_array_extend_alloc(i32, &allocator, array2, array3, ARRAY_INIT_NONE); array = wpArrayExtendAlloc(i32, &allocator, array2, array3, WP_ARRAY_INIT_NONE);
result = result && array != array2; result = result && array != array2;
wapp_mem_arena_allocator_destroy(&allocator); wpMemArenaAllocatorDestroy(&allocator);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_copy_alloc(void) { WpTestFuncResult test_i32_array_copy_alloc(void) {
b8 result; b8 result;
Allocator allocator = wapp_mem_arena_allocator_init(MiB(4)); WpAllocator allocator = wpMemArenaAllocatorInit(MiB(4));
I32Array src = wapp_array(i32, 1, 2, 3, 4, 5); WpI32Array src = wpArray(i32, 1, 2, 3, 4, 5);
I32Array dst1 = wapp_array(i32, 1, 2, 3, 4, 5, 6); WpI32Array dst1 = wpArray(i32, 1, 2, 3, 4, 5, 6);
I32Array dst2 = wapp_array(i32, 1, 2); WpI32Array dst2 = wpArray(i32, 1, 2);
I32Array array = nullptr; WpI32Array array = nullptr;
u64 expected_count = 5; u64 expected_count = 5;
array = wapp_array_copy_alloc(i32, &allocator, dst1, src, ARRAY_INIT_NONE); array = wpArrayCopyAlloc(i32, &allocator, dst1, src, WP_ARRAY_INIT_NONE);
result = wapp_array_count(array) == expected_count && array == dst1; result = wpArrayCount(array) == expected_count && array == dst1;
u64 index = 0; u64 index = 0;
b8 running = true; b8 running = true;
while (running) { while (running) {
result = result && (*wapp_array_get(i32, src, index) == *wapp_array_get(i32, array, index)); result = result && (*wpArrayGet(i32, src, index) == *wpArrayGet(i32, array, index));
++index; ++index;
running = index < expected_count; running = index < expected_count;
} }
expected_count = 5; expected_count = 5;
array = wapp_array_copy_alloc(i32, &allocator, dst2, src, ARRAY_INIT_NONE); array = wpArrayCopyAlloc(i32, &allocator, dst2, src, WP_ARRAY_INIT_NONE);
result = result && wapp_array_count(array) == expected_count && array != dst2; result = result && wpArrayCount(array) == expected_count && array != dst2;
index = 0; index = 0;
running = true; running = true;
while (running) { while (running) {
result = result && (*wapp_array_get(i32, src, index) == *wapp_array_get(i32, array, index)); result = result && (*wpArrayGet(i32, src, index) == *wpArrayGet(i32, array, index));
++index; ++index;
running = index < expected_count; running = index < expected_count;
} }
wapp_mem_arena_allocator_destroy(&allocator); wpMemArenaAllocatorDestroy(&allocator);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_clear(void) { WpTestFuncResult test_i32_array_clear(void) {
b8 result; b8 result;
I32Array array = wapp_array(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8); WpI32Array array = wpArray(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8);
result = wapp_array_count(array) == 9; result = wpArrayCount(array) == 9;
wapp_array_clear(i32, array); wpArrayClear(i32, array);
result = result && wapp_array_count(array) == 0; result = result && wpArrayCount(array) == 0;
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_i32_array_pop(void) { WpTestFuncResult test_i32_array_remove_swap_end(void) {
b8 result; b8 result;
I32Array array1 = wapp_array(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8); WpI32Array array = wpArray(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8);
I32Array array2 = wapp_array_with_capacity(i32, 32, ARRAY_INIT_NONE); result = wpArrayCount(array) == 9 && array[4] == 4;
i32 item1 = wapp_array_pop(i32, array1); wpArrayRemoveSwapEnd(i32, array, 4);
i32 item2 = wapp_array_pop(i32, array2);
result = result && wpArrayCount(array) == 8 && array[4] == 8;
return wpTesterResult(result);
}
WpTestFuncResult test_i32_array_pop(void) {
b8 result;
WpI32Array array1 = wpArray(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8);
WpI32Array array2 = wpArrayWithCapacity(i32, 32, WP_ARRAY_INIT_NONE);
i32 item1 = wpArrayPop(i32, array1);
i32 item2 = wpArrayPop(i32, array2);
result = item1 == 8 && item2 == 0; result = item1 == 8 && item2 == 0;
return wapp_tester_result(result); return wpTesterResult(result);
} }
+14 -13
View File
@@ -3,18 +3,19 @@
#include "wapp.h" #include "wapp.h"
TestFuncResult test_i32_array(void); WpTestFuncResult test_i32_array(void);
TestFuncResult test_i32_array_with_capacity(void); WpTestFuncResult test_i32_array_with_capacity(void);
TestFuncResult test_i32_array_get(void); WpTestFuncResult test_i32_array_get(void);
TestFuncResult test_i32_array_set(void); WpTestFuncResult test_i32_array_set(void);
TestFuncResult test_i32_array_append_capped(void); WpTestFuncResult test_i32_array_append_capped(void);
TestFuncResult test_i32_array_extend_capped(void); WpTestFuncResult test_i32_array_extend_capped(void);
TestFuncResult test_i32_array_copy_capped(void); WpTestFuncResult test_i32_array_copy_capped(void);
TestFuncResult test_i32_array_alloc_capacity(void); WpTestFuncResult test_i32_array_alloc_capacity(void);
TestFuncResult test_i32_array_append_alloc(void); WpTestFuncResult test_i32_array_append_alloc(void);
TestFuncResult test_i32_array_extend_alloc(void); WpTestFuncResult test_i32_array_extend_alloc(void);
TestFuncResult test_i32_array_copy_alloc(void); WpTestFuncResult test_i32_array_copy_alloc(void);
TestFuncResult test_i32_array_pop(void); WpTestFuncResult test_i32_array_remove_swap_end(void);
TestFuncResult test_i32_array_clear(void); WpTestFuncResult test_i32_array_pop(void);
WpTestFuncResult test_i32_array_clear(void);
#endif // !TEST_INT_ARRAY_H #endif // !TEST_INT_ARRAY_H
+9 -9
View File
@@ -2,24 +2,24 @@
#include "test_str8_array.h" #include "test_str8_array.h"
TestFuncResult test_str8_array(void) { WpTestFuncResult test_str8_array(void) {
b8 result; b8 result;
Str8 expected[] = {wapp_str8_lit("Hello"), wapp_str8_lit("Hi"), wapp_str8_lit("Bye")}; WpStr8 expected[] = {wpStr8Lit("Hello"), wpStr8Lit("Hi"), wpStr8Lit("Bye")};
Str8Array array = wapp_array(Str8, wapp_str8_lit("Hello"), wapp_str8_lit("Hi"), wapp_str8_lit("Bye")); WpStr8Array array = wpArray(WpStr8, wpStr8Lit("Hello"), wpStr8Lit("Hi"), wpStr8Lit("Bye"));
result = wapp_array_count(array) == 3 && wapp_array_capacity(array) == 8; result = wpArrayCount(array) == 3 && wpArrayCapacity(array) == 8;
Str8 *item; WpStr8 *item;
u64 count = wapp_array_count(array); u64 count = wpArrayCount(array);
u64 index = 0; u64 index = 0;
b8 running = true; b8 running = true;
while (running) { while (running) {
item = wapp_array_get(Str8, array, index); item = wpArrayGet(WpStr8, array, index);
result = result && item && (wapp_str8_equal(item, &expected[index])); result = result && item && (wpStr8Equal(item, &expected[index]));
++index; ++index;
running = index < count; running = index < count;
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
+12 -12
View File
@@ -2,29 +2,29 @@
#include "test_str8_array.h" #include "test_str8_array.h"
TestFuncResult test_str8_array(void) { WpTestFuncResult test_str8_array(void) {
b8 result; b8 result;
Str8 expected[] = {wapp_str8_lit("Hello"), wapp_str8_lit("Hi"), wapp_str8_lit("Bye")}; WpStr8 expected[] = {wpStr8Lit("Hello"), wpStr8Lit("Hi"), wpStr8Lit("Bye")};
Str8 str1 = wapp_str8_lit("Hello"); WpStr8 str1 = wpStr8Lit("Hello");
Str8 str2 = wapp_str8_lit("Hi"); WpStr8 str2 = wpStr8Lit("Hi");
Str8 str3 = wapp_str8_lit("Bye"); WpStr8 str3 = wpStr8Lit("Bye");
Str8Array array = wapp_array(Str8, str1, str2, str3); WpStr8Array array = wpArray(WpStr8, str1, str2, str3);
result = wapp_array_count(array) == 3 && wapp_array_capacity(array) == 8; result = wpArrayCount(array) == 3 && wpArrayCapacity(array) == 8;
Str8 *item; WpStr8 *item;
u64 count = wapp_array_count(array); u64 count = wpArrayCount(array);
u64 index = 0; u64 index = 0;
b8 running = true; b8 running = true;
while (running) { while (running) {
item = wapp_array_get(Str8, array, index); item = wpArrayGet(WpStr8, array, index);
result = result && item && (wapp_str8_equal(item, &expected[index])); result = result && item && (wpStr8Equal(item, &expected[index]));
++index; ++index;
running = index < count; running = index < count;
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
+1 -1
View File
@@ -5,6 +5,6 @@
#include "wapp.h" #include "wapp.h"
TestFuncResult test_str8_array(void); WpTestFuncResult test_str8_array(void);
#endif // !TEST_STR8_ARRAY_H #endif // !TEST_STR8_ARRAY_H
+102 -102
View File
@@ -6,176 +6,176 @@
#define MAIN_BUF_SIZE 4096 #define MAIN_BUF_SIZE 4096
#define TMP_BUF_SIZE 1024 #define TMP_BUF_SIZE 1024
TestFuncResult test_cpath_join_path(void) { WpTestFuncResult test_cpath_join_path(void) {
b8 result; b8 result;
Str8 expected = wapp_str8_buf(MAIN_BUF_SIZE); WpStr8 expected = wpStr8Buf(MAIN_BUF_SIZE);
Str8 out = wapp_str8_buf(MAIN_BUF_SIZE); WpStr8 out = wpStr8Buf(MAIN_BUF_SIZE);
Str8 tmp = wapp_str8_buf(TMP_BUF_SIZE); WpStr8 tmp = wpStr8Buf(TMP_BUF_SIZE);
wapp_str8_format(&expected, "%chome%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&expected, "%chome%cabdelrahman%cDocuments", WP_PATH_SEP, WP_PATH_SEP, WP_PATH_SEP);
wapp_str8_format(&tmp, "%c", WAPP_PATH_SEP); wpStr8Format(&tmp, "%c", WP_PATH_SEP);
Str8List parts = wapp_dbl_list(Str8); WpStr8List parts = wpDblList(WpStr8);
wapp_dbl_list_push_back(Str8, &parts, &tmp); wpDblListPushBack(WpStr8, &parts, &tmp);
wapp_dbl_list_push_back(Str8, &parts, &wapp_str8_lit("home")); wpDblListPushBack(WpStr8, &parts, &wpStr8Lit("home"));
wapp_dbl_list_push_back(Str8, &parts, &wapp_str8_lit("abdelrahman")); wpDblListPushBack(WpStr8, &parts, &wpStr8Lit("abdelrahman"));
wapp_dbl_list_push_back(Str8, &parts, &wapp_str8_lit("Documents")); wpDblListPushBack(WpStr8, &parts, &wpStr8Lit("Documents"));
wapp_cpath_join_path(&out, &parts); wpCpathJoinPath(&out, &parts);
result = wapp_str8_equal(&out, &expected); result = wpStr8Equal(&out, &expected);
wapp_dbl_list_pop_front(Str8, &parts); wpDblListPopFront(WpStr8, &parts);
wapp_str8_format(&expected, "home%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&expected, "home%cabdelrahman%cDocuments", WP_PATH_SEP, WP_PATH_SEP);
wapp_cpath_join_path(&out, &parts); wpCpathJoinPath(&out, &parts);
result = result && wapp_str8_equal(&out, &expected); result = result && wpStr8Equal(&out, &expected);
wapp_str8_concat_capped(&tmp, &wapp_str8_lit_ro("home")); wpStr8ConcatCapped(&tmp, &wpStr8LitRo("home"));
wapp_dbl_list_pop_front(Str8, &parts); wpDblListPopFront(WpStr8, &parts);
wapp_dbl_list_push_front(Str8, &parts, &tmp); wpDblListPushFront(WpStr8, &parts, &tmp);
wapp_str8_format(&expected, "%chome%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&expected, "%chome%cabdelrahman%cDocuments", WP_PATH_SEP, WP_PATH_SEP, WP_PATH_SEP);
wapp_cpath_join_path(&out, &parts); wpCpathJoinPath(&out, &parts);
result = result && wapp_str8_equal(&out, &expected); result = result && wpStr8Equal(&out, &expected);
wapp_str8_format(&tmp, "home%c", WAPP_PATH_SEP); wpStr8Format(&tmp, "home%c", WP_PATH_SEP);
wapp_dbl_list_pop_front(Str8, &parts); wpDblListPopFront(WpStr8, &parts);
wapp_dbl_list_push_front(Str8, &parts, &wapp_str8_lit("home")); wpDblListPushFront(WpStr8, &parts, &wpStr8Lit("home"));
wapp_str8_format(&expected, "home%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&expected, "home%cabdelrahman%cDocuments", WP_PATH_SEP, WP_PATH_SEP);
wapp_cpath_join_path(&out, &parts); wpCpathJoinPath(&out, &parts);
result = result && wapp_str8_equal(&out, &expected); result = result && wpStr8Equal(&out, &expected);
wapp_dbl_list_empty(Str8, &parts); wpDblListEmpty(WpStr8, &parts);
wapp_str8_format(&tmp, "%chome", WAPP_PATH_SEP); wpStr8Format(&tmp, "%chome", WP_PATH_SEP);
wapp_dbl_list_push_back(Str8, &parts, &tmp); wpDblListPushBack(WpStr8, &parts, &tmp);
wapp_dbl_list_push_back(Str8, &parts, &wapp_str8_lit("")); wpDblListPushBack(WpStr8, &parts, &wpStr8Lit(""));
wapp_str8_format(&expected, "%chome", WAPP_PATH_SEP); wpStr8Format(&expected, "%chome", WP_PATH_SEP);
wapp_cpath_join_path(&out, &parts); wpCpathJoinPath(&out, &parts);
result = result && wapp_str8_equal(&out, &expected); result = result && wpStr8Equal(&out, &expected);
wapp_dbl_list_pop_front(Str8, &parts); wpDblListPopFront(WpStr8, &parts);
wapp_dbl_list_push_back(Str8, &parts, &wapp_str8_lit("")); wpDblListPushBack(WpStr8, &parts, &wpStr8Lit(""));
wapp_str8_format(&expected, "%s", ""); wpStr8Format(&expected, "%s", "");
wapp_cpath_join_path(&out, &parts); wpCpathJoinPath(&out, &parts);
result = result && wapp_str8_equal(&out, &expected); result = result && wpStr8Equal(&out, &expected);
wapp_dbl_list_pop_back(Str8, &parts); wpDblListPopBack(WpStr8, &parts);
wapp_dbl_list_push_back(Str8, &parts, &wapp_str8_lit("home")); wpDblListPushBack(WpStr8, &parts, &wpStr8Lit("home"));
wapp_str8_copy_cstr_capped(&expected, "home"); wpStr8CopyCstrCapped(&expected, "home");
wapp_cpath_join_path(&out, &parts); wpCpathJoinPath(&out, &parts);
result = result && wapp_str8_equal(&out, &expected); result = result && wpStr8Equal(&out, &expected);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_cpath_dirname(void) { WpTestFuncResult test_cpath_dirname(void) {
Allocator arena = wapp_mem_arena_allocator_init(MiB(8)); WpAllocator arena = wpMemArenaAllocatorInit(MiB(8));
if (wapp_mem_allocator_invalid(&arena)) { if (wpMemAllocatorInvalid(&arena)) {
return wapp_tester_result(false); return wpTesterResult(false);
} }
b8 result; b8 result;
Str8 *output = NULL; WpStr8 *output = NULL;
Str8 expected = wapp_str8_buf(MAIN_BUF_SIZE); WpStr8 expected = wpStr8Buf(MAIN_BUF_SIZE);
Str8 tmp = wapp_str8_buf(TMP_BUF_SIZE); WpStr8 tmp = wpStr8Buf(TMP_BUF_SIZE);
// CASE 1 // CASE 1
wapp_str8_format(&tmp, "%c", WAPP_PATH_SEP); wpStr8Format(&tmp, "%c", WP_PATH_SEP);
wapp_str8_format(&expected, "%c", WAPP_PATH_SEP); wpStr8Format(&expected, "%c", WP_PATH_SEP);
output = wapp_cpath_dirname(&arena, &tmp); output = wpCpathDirname(&arena, &tmp);
result = output != NULL && wapp_str8_equal(output, &expected); result = output != NULL && wpStr8Equal(output, &expected);
// CASE 2 // CASE 2
wapp_str8_format(&expected, "%s", "."); wpStr8Format(&expected, "%s", ".");
output = wapp_cpath_dirname(&arena, &wapp_str8_lit("home")); output = wpCpathDirname(&arena, &wpStr8Lit("home"));
result = result && output != NULL && wapp_str8_equal(output, &expected); result = result && output != NULL && wpStr8Equal(output, &expected);
// CASE 3 // CASE 3
output = wapp_cpath_dirname(&arena, &wapp_str8_lit("")); output = wpCpathDirname(&arena, &wpStr8Lit(""));
result = result && output != NULL && wapp_str8_equal(output, &expected); result = result && output != NULL && wpStr8Equal(output, &expected);
// CASE 4 // CASE 4
wapp_str8_format(&tmp, "%chome%ctest", WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&tmp, "%chome%ctest", WP_PATH_SEP, WP_PATH_SEP);
wapp_str8_format(&expected, "%chome", WAPP_PATH_SEP); wpStr8Format(&expected, "%chome", WP_PATH_SEP);
output = wapp_cpath_dirname(&arena, &tmp); output = wpCpathDirname(&arena, &tmp);
result = result && output != NULL && wapp_str8_equal(output, &expected); result = result && output != NULL && wpStr8Equal(output, &expected);
// CASE 5 // CASE 5
wapp_str8_format(&tmp, "%chome%ctest%c", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&tmp, "%chome%ctest%c", WP_PATH_SEP, WP_PATH_SEP, WP_PATH_SEP);
wapp_str8_format(&expected, "%chome", WAPP_PATH_SEP); wpStr8Format(&expected, "%chome", WP_PATH_SEP);
output = wapp_cpath_dirname(&arena, &tmp); output = wpCpathDirname(&arena, &tmp);
result = result && output != NULL && wapp_str8_equal(output, &expected); result = result && output != NULL && wpStr8Equal(output, &expected);
wapp_mem_arena_allocator_destroy(&arena); wpMemArenaAllocatorDestroy(&arena);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_cpath_dirup(void) { WpTestFuncResult test_cpath_dirup(void) {
Allocator arena = wapp_mem_arena_allocator_init(MiB(8)); WpAllocator arena = wpMemArenaAllocatorInit(MiB(8));
if (wapp_mem_allocator_invalid(&arena)) { if (wpMemAllocatorInvalid(&arena)) {
return wapp_tester_result(false); return wpTesterResult(false);
} }
b8 result; b8 result;
Str8 *output = NULL; WpStr8 *output = NULL;
Str8 expected = wapp_str8_buf(MAIN_BUF_SIZE); WpStr8 expected = wpStr8Buf(MAIN_BUF_SIZE);
Str8 tmp = wapp_str8_buf(TMP_BUF_SIZE); WpStr8 tmp = wpStr8Buf(TMP_BUF_SIZE);
// CASE 1 // CASE 1
wapp_str8_format(&tmp, "%c", WAPP_PATH_SEP); wpStr8Format(&tmp, "%c", WP_PATH_SEP);
wapp_str8_format(&expected, "%c", WAPP_PATH_SEP); wpStr8Format(&expected, "%c", WP_PATH_SEP);
output = wapp_cpath_dirup(&arena, &tmp, 3); output = wpCpathDirUp(&arena, &tmp, 3);
result = output != NULL && wapp_str8_equal(output, &expected); result = output != NULL && wpStr8Equal(output, &expected);
// CASE 2 // CASE 2
wapp_str8_format(&tmp, "%chome%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&tmp, "%chome%cabdelrahman%cDocuments", WP_PATH_SEP, WP_PATH_SEP, WP_PATH_SEP);
wapp_str8_format(&expected, "%c", WAPP_PATH_SEP); wpStr8Format(&expected, "%c", WP_PATH_SEP);
output = wapp_cpath_dirup(&arena, &tmp, 3); output = wpCpathDirUp(&arena, &tmp, 3);
result = result && output != NULL && wapp_str8_equal(output, &expected); result = result && output != NULL && wpStr8Equal(output, &expected);
// CASE 3 // CASE 3
wapp_str8_format(&tmp, "home%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&tmp, "home%cabdelrahman%cDocuments", WP_PATH_SEP, WP_PATH_SEP);
wapp_str8_copy_cstr_capped(&expected, "."); wpStr8CopyCstrCapped(&expected, ".");
output = wapp_cpath_dirup(&arena, &tmp, 3); output = wpCpathDirUp(&arena, &tmp, 3);
result = result && output != NULL && wapp_str8_equal(output, &expected); result = result && output != NULL && wpStr8Equal(output, &expected);
// CASE 4 // CASE 4
wapp_str8_format(&tmp, "%chome%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&tmp, "%chome%cabdelrahman%cDocuments", WP_PATH_SEP, WP_PATH_SEP, WP_PATH_SEP);
wapp_str8_format(&expected, "%chome", WAPP_PATH_SEP); wpStr8Format(&expected, "%chome", WP_PATH_SEP);
output = wapp_cpath_dirup(&arena, &tmp, 2); output = wpCpathDirUp(&arena, &tmp, 2);
result = result && output != NULL && wapp_str8_equal(output, &expected); result = result && output != NULL && wpStr8Equal(output, &expected);
// CASE 5 // CASE 5
wapp_str8_format(&tmp, "home%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&tmp, "home%cabdelrahman%cDocuments", WP_PATH_SEP, WP_PATH_SEP);
wapp_str8_copy_cstr_capped(&expected, "home"); wpStr8CopyCstrCapped(&expected, "home");
output = wapp_cpath_dirup(&arena, &tmp, 2); output = wpCpathDirUp(&arena, &tmp, 2);
result = result && output != NULL && wapp_str8_equal(output, &expected); result = result && output != NULL && wpStr8Equal(output, &expected);
wapp_mem_arena_allocator_destroy(&arena); wpMemArenaAllocatorDestroy(&arena);
return wapp_tester_result(result); return wpTesterResult(result);
} }
+112 -112
View File
@@ -6,196 +6,196 @@
#define MAIN_BUF_SIZE 4096 #define MAIN_BUF_SIZE 4096
#define TMP_BUF_SIZE 1024 #define TMP_BUF_SIZE 1024
TestFuncResult test_cpath_join_path(void) { WpTestFuncResult test_cpath_join_path(void) {
b8 result; b8 result;
Str8 expected = wapp_str8_buf(MAIN_BUF_SIZE); WpStr8 expected = wpStr8Buf(MAIN_BUF_SIZE);
Str8 out = wapp_str8_buf(MAIN_BUF_SIZE); WpStr8 out = wpStr8Buf(MAIN_BUF_SIZE);
Str8 tmp = wapp_str8_buf(TMP_BUF_SIZE); WpStr8 tmp = wpStr8Buf(TMP_BUF_SIZE);
wapp_str8_format(&expected, "%chome%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&expected, "%chome%cabdelrahman%cDocuments", WP_PATH_SEP, WP_PATH_SEP, WP_PATH_SEP);
wapp_str8_format(&tmp, "%c", WAPP_PATH_SEP); wpStr8Format(&tmp, "%c", WP_PATH_SEP);
Str8List parts = wapp_dbl_list(Str8); WpStr8List parts = wpDblList(WpStr8);
wapp_dbl_list_push_back(Str8, &parts, &tmp); wpDblListPushBack(WpStr8, &parts, &tmp);
Str8 home = wapp_str8_lit("home"); WpStr8 home = wpStr8Lit("home");
wapp_dbl_list_push_back(Str8, &parts, &home); wpDblListPushBack(WpStr8, &parts, &home);
Str8 user = wapp_str8_lit("abdelrahman"); WpStr8 user = wpStr8Lit("abdelrahman");
wapp_dbl_list_push_back(Str8, &parts, &user); wpDblListPushBack(WpStr8, &parts, &user);
Str8 docs = wapp_str8_lit("Documents"); WpStr8 docs = wpStr8Lit("Documents");
wapp_dbl_list_push_back(Str8, &parts, &docs); wpDblListPushBack(WpStr8, &parts, &docs);
wapp_cpath_join_path(&out, &parts); wpCpathJoinPath(&out, &parts);
result = wapp_str8_equal(&out, &expected); result = wpStr8Equal(&out, &expected);
wapp_dbl_list_pop_front(Str8, &parts); wpDblListPopFront(WpStr8, &parts);
wapp_str8_format(&expected, "home%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&expected, "home%cabdelrahman%cDocuments", WP_PATH_SEP, WP_PATH_SEP);
wapp_cpath_join_path(&out, &parts); wpCpathJoinPath(&out, &parts);
result = result && wapp_str8_equal(&out, &expected); result = result && wpStr8Equal(&out, &expected);
Str8RO str = wapp_str8_lit_ro("home"); WpStr8RO str = wpStr8LitRo("home");
wapp_str8_concat_capped(&tmp, &str); wpStr8ConcatCapped(&tmp, &str);
wapp_dbl_list_pop_front(Str8, &parts); wpDblListPopFront(WpStr8, &parts);
wapp_dbl_list_push_front(Str8, &parts, &tmp); wpDblListPushFront(WpStr8, &parts, &tmp);
wapp_str8_format(&expected, "%chome%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&expected, "%chome%cabdelrahman%cDocuments", WP_PATH_SEP, WP_PATH_SEP, WP_PATH_SEP);
wapp_cpath_join_path(&out, &parts); wpCpathJoinPath(&out, &parts);
result = result && wapp_str8_equal(&out, &expected); result = result && wpStr8Equal(&out, &expected);
wapp_str8_format(&tmp, "home%c", WAPP_PATH_SEP); wpStr8Format(&tmp, "home%c", WP_PATH_SEP);
wapp_dbl_list_pop_front(Str8, &parts); wpDblListPopFront(WpStr8, &parts);
Str8 home_2 = wapp_str8_lit("home"); WpStr8 home_2 = wpStr8Lit("home");
wapp_dbl_list_push_front(Str8, &parts, &home_2); wpDblListPushFront(WpStr8, &parts, &home_2);
wapp_str8_format(&expected, "home%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&expected, "home%cabdelrahman%cDocuments", WP_PATH_SEP, WP_PATH_SEP);
wapp_cpath_join_path(&out, &parts); wpCpathJoinPath(&out, &parts);
result = result && wapp_str8_equal(&out, &expected); result = result && wpStr8Equal(&out, &expected);
wapp_dbl_list_empty(Str8, &parts); wpDblListEmpty(WpStr8, &parts);
wapp_str8_format(&tmp, "%chome", WAPP_PATH_SEP); wpStr8Format(&tmp, "%chome", WP_PATH_SEP);
wapp_dbl_list_push_back(Str8, &parts, &tmp); wpDblListPushBack(WpStr8, &parts, &tmp);
Str8 empty = wapp_str8_lit(""); WpStr8 empty = wpStr8Lit("");
wapp_dbl_list_push_back(Str8, &parts, &empty); wpDblListPushBack(WpStr8, &parts, &empty);
wapp_str8_format(&expected, "%chome", WAPP_PATH_SEP); wpStr8Format(&expected, "%chome", WP_PATH_SEP);
wapp_cpath_join_path(&out, &parts); wpCpathJoinPath(&out, &parts);
result = result && wapp_str8_equal(&out, &expected); result = result && wpStr8Equal(&out, &expected);
wapp_dbl_list_pop_front(Str8, &parts); wpDblListPopFront(WpStr8, &parts);
Str8 empty_2 = wapp_str8_lit(""); WpStr8 empty_2 = wpStr8Lit("");
wapp_dbl_list_push_back(Str8, &parts, &empty_2); wpDblListPushBack(WpStr8, &parts, &empty_2);
wapp_str8_format(&expected, "%s", ""); wpStr8Format(&expected, "%s", "");
wapp_cpath_join_path(&out, &parts); wpCpathJoinPath(&out, &parts);
result = result && wapp_str8_equal(&out, &expected); result = result && wpStr8Equal(&out, &expected);
wapp_dbl_list_pop_back(Str8, &parts); wpDblListPopBack(WpStr8, &parts);
Str8 home_3 = wapp_str8_lit("home"); WpStr8 home_3 = wpStr8Lit("home");
wapp_dbl_list_push_back(Str8, &parts, &home_3); wpDblListPushBack(WpStr8, &parts, &home_3);
wapp_str8_copy_cstr_capped(&expected, "home"); wpStr8CopyCstrCapped(&expected, "home");
wapp_cpath_join_path(&out, &parts); wpCpathJoinPath(&out, &parts);
result = result && wapp_str8_equal(&out, &expected); result = result && wpStr8Equal(&out, &expected);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_cpath_dirname(void) { WpTestFuncResult test_cpath_dirname(void) {
Allocator arena = wapp_mem_arena_allocator_init(MiB(8)); WpAllocator arena = wpMemArenaAllocatorInit(MiB(8));
if (wapp_mem_allocator_invalid(&arena)) { if (wpMemAllocatorInvalid(&arena)) {
return wapp_tester_result(false); return wpTesterResult(false);
} }
b8 result; b8 result;
Str8 *output = nullptr; WpStr8 *output = nullptr;
Str8 expected = wapp_str8_buf(MAIN_BUF_SIZE); WpStr8 expected = wpStr8Buf(MAIN_BUF_SIZE);
Str8 tmp = wapp_str8_buf(TMP_BUF_SIZE); WpStr8 tmp = wpStr8Buf(TMP_BUF_SIZE);
// CASE 1 // CASE 1
wapp_str8_format(&tmp, "%c", WAPP_PATH_SEP); wpStr8Format(&tmp, "%c", WP_PATH_SEP);
wapp_str8_format(&expected, "%c", WAPP_PATH_SEP); wpStr8Format(&expected, "%c", WP_PATH_SEP);
output = wapp_cpath_dirname(&arena, &tmp); output = wpCpathDirname(&arena, &tmp);
result = output != nullptr && wapp_str8_equal(output, &expected); result = output != nullptr && wpStr8Equal(output, &expected);
// CASE 2 // CASE 2
wapp_str8_format(&expected, "%s", "."); wpStr8Format(&expected, "%s", ".");
Str8 path = wapp_str8_lit("home"); WpStr8 path = wpStr8Lit("home");
output = wapp_cpath_dirname(&arena, &path); output = wpCpathDirname(&arena, &path);
result = result && output != nullptr && wapp_str8_equal(output, &expected); result = result && output != nullptr && wpStr8Equal(output, &expected);
// CASE 3 // CASE 3
path = wapp_str8_lit(""); path = wpStr8Lit("");
output = wapp_cpath_dirname(&arena, &path); output = wpCpathDirname(&arena, &path);
result = result && output != nullptr && wapp_str8_equal(output, &expected); result = result && output != nullptr && wpStr8Equal(output, &expected);
// CASE 4 // CASE 4
wapp_str8_format(&tmp, "%chome%ctest", WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&tmp, "%chome%ctest", WP_PATH_SEP, WP_PATH_SEP);
wapp_str8_format(&expected, "%chome", WAPP_PATH_SEP); wpStr8Format(&expected, "%chome", WP_PATH_SEP);
output = wapp_cpath_dirname(&arena, &tmp); output = wpCpathDirname(&arena, &tmp);
result = result && output != nullptr && wapp_str8_equal(output, &expected); result = result && output != nullptr && wpStr8Equal(output, &expected);
// CASE 5 // CASE 5
wapp_str8_format(&tmp, "%chome%ctest%c", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&tmp, "%chome%ctest%c", WP_PATH_SEP, WP_PATH_SEP, WP_PATH_SEP);
wapp_str8_format(&expected, "%chome", WAPP_PATH_SEP); wpStr8Format(&expected, "%chome", WP_PATH_SEP);
output = wapp_cpath_dirname(&arena, &tmp); output = wpCpathDirname(&arena, &tmp);
result = result && output != nullptr && wapp_str8_equal(output, &expected); result = result && output != nullptr && wpStr8Equal(output, &expected);
wapp_mem_arena_allocator_destroy(&arena); wpMemArenaAllocatorDestroy(&arena);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_cpath_dirup(void) { WpTestFuncResult test_cpath_dirup(void) {
Allocator arena = wapp_mem_arena_allocator_init(MiB(8)); WpAllocator arena = wpMemArenaAllocatorInit(MiB(8));
if (wapp_mem_allocator_invalid(&arena)) { if (wpMemAllocatorInvalid(&arena)) {
return wapp_tester_result(false); return wpTesterResult(false);
} }
b8 result; b8 result;
Str8 *output = nullptr; WpStr8 *output = nullptr;
Str8 expected = wapp_str8_buf(MAIN_BUF_SIZE); WpStr8 expected = wpStr8Buf(MAIN_BUF_SIZE);
Str8 tmp = wapp_str8_buf(TMP_BUF_SIZE); WpStr8 tmp = wpStr8Buf(TMP_BUF_SIZE);
// CASE 1 // CASE 1
wapp_str8_format(&tmp, "%c", WAPP_PATH_SEP); wpStr8Format(&tmp, "%c", WP_PATH_SEP);
wapp_str8_format(&expected, "%c", WAPP_PATH_SEP); wpStr8Format(&expected, "%c", WP_PATH_SEP);
output = wapp_cpath_dirup(&arena, &tmp, 3); output = wpCpathDirUp(&arena, &tmp, 3);
result = output != nullptr && wapp_str8_equal(output, &expected); result = output != nullptr && wpStr8Equal(output, &expected);
// CASE 2 // CASE 2
wapp_str8_format(&tmp, "%chome%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&tmp, "%chome%cabdelrahman%cDocuments", WP_PATH_SEP, WP_PATH_SEP, WP_PATH_SEP);
wapp_str8_format(&expected, "%c", WAPP_PATH_SEP); wpStr8Format(&expected, "%c", WP_PATH_SEP);
output = wapp_cpath_dirup(&arena, &tmp, 3); output = wpCpathDirUp(&arena, &tmp, 3);
result = result && output != nullptr && wapp_str8_equal(output, &expected); result = result && output != nullptr && wpStr8Equal(output, &expected);
// CASE 3 // CASE 3
wapp_str8_format(&tmp, "home%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&tmp, "home%cabdelrahman%cDocuments", WP_PATH_SEP, WP_PATH_SEP);
wapp_str8_copy_cstr_capped(&expected, "."); wpStr8CopyCstrCapped(&expected, ".");
output = wapp_cpath_dirup(&arena, &tmp, 3); output = wpCpathDirUp(&arena, &tmp, 3);
result = result && output != nullptr && wapp_str8_equal(output, &expected); result = result && output != nullptr && wpStr8Equal(output, &expected);
// CASE 4 // CASE 4
wapp_str8_format(&tmp, "%chome%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&tmp, "%chome%cabdelrahman%cDocuments", WP_PATH_SEP, WP_PATH_SEP, WP_PATH_SEP);
wapp_str8_format(&expected, "%chome", WAPP_PATH_SEP); wpStr8Format(&expected, "%chome", WP_PATH_SEP);
output = wapp_cpath_dirup(&arena, &tmp, 2); output = wpCpathDirUp(&arena, &tmp, 2);
result = result && output != nullptr && wapp_str8_equal(output, &expected); result = result && output != nullptr && wpStr8Equal(output, &expected);
// CASE 5 // CASE 5
wapp_str8_format(&tmp, "home%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP); wpStr8Format(&tmp, "home%cabdelrahman%cDocuments", WP_PATH_SEP, WP_PATH_SEP);
wapp_str8_copy_cstr_capped(&expected, "home"); wpStr8CopyCstrCapped(&expected, "home");
output = wapp_cpath_dirup(&arena, &tmp, 2); output = wpCpathDirUp(&arena, &tmp, 2);
result = result && output != nullptr && wapp_str8_equal(output, &expected); result = result && output != nullptr && wpStr8Equal(output, &expected);
wapp_mem_arena_allocator_destroy(&arena); wpMemArenaAllocatorDestroy(&arena);
return wapp_tester_result(result); return wpTesterResult(result);
} }
+3 -3
View File
@@ -3,8 +3,8 @@
#include "wapp.h" #include "wapp.h"
TestFuncResult test_cpath_join_path(void); WpTestFuncResult test_cpath_join_path(void);
TestFuncResult test_cpath_dirname(void); WpTestFuncResult test_cpath_dirname(void);
TestFuncResult test_cpath_dirup(void); WpTestFuncResult test_cpath_dirup(void);
#endif // !TEST_CPATH_H #endif // !TEST_CPATH_H
+59 -59
View File
@@ -3,48 +3,48 @@
#include "test_file.h" #include "test_file.h"
#define DST_CAPACITY 5 #define DST_CAPACITY 5
wapp_intern Allocator arena = {0}; wp_intern WpAllocator arena = {0};
wapp_intern Str8RO test_filename = wapp_str8_lit_ro_initialiser_list("wapptest.bin"); wp_intern WpStr8RO test_filename = wpStr8LitRoInitialiserList("wapptest.bin");
wapp_intern Str8RO new_filename = wapp_str8_lit_ro_initialiser_list("wapptest2.bin"); wp_intern WpStr8RO new_filename = wpStr8LitRoInitialiserList("wapptest2.bin");
wapp_intern WFile *test_fp = NULL; wp_intern WpFile *test_fp = NULL;
wapp_intern I32Array src_array1 = wapp_array(i32, 0, 1, 2, 3, 4); wp_intern WpI32Array src_array1 = wpArray(i32, 0, 1, 2, 3, 4);
wapp_intern I32Array src_array2 = wapp_array(i32, 5, 6, 7, 8, 9); wp_intern WpI32Array src_array2 = wpArray(i32, 5, 6, 7, 8, 9);
wapp_intern I32Array src_array3 = wapp_array(i32, 10, 11, 12, 13, 14); wp_intern WpI32Array src_array3 = wpArray(i32, 10, 11, 12, 13, 14);
wapp_intern I32Array dst_array = wapp_array_with_capacity(i32, DST_CAPACITY, false); wp_intern WpI32Array dst_array = wpArrayWithCapacity(i32, DST_CAPACITY, false);
wapp_intern i32 dst_buf[DST_CAPACITY] = {0}; wp_intern i32 dst_buf[DST_CAPACITY] = {0};
TestFuncResult test_wapp_file_open(void) { WpTestFuncResult test_wapp_file_open(void) {
arena = wapp_mem_arena_allocator_init(KiB(16)); arena = wpMemArenaAllocatorInit(KiB(16));
test_fp = wapp_file_open(&arena, &test_filename, WAPP_ACCESS_WRITE_EX); test_fp = wpFileOpen(&arena, &test_filename, WP_ACCESS_WRITE_EX);
return wapp_tester_result(test_fp != NULL); return wpTesterResult(test_fp != NULL);
} }
TestFuncResult test_wapp_file_get_current_position(void) { WpTestFuncResult test_wapp_file_get_current_position(void) {
i64 pos = wapp_file_get_current_position(test_fp); i64 pos = wpFileGetCurrentPosition(test_fp);
return wapp_tester_result(pos == 0); return wpTesterResult(pos == 0);
} }
TestFuncResult test_wapp_file_seek(void) { WpTestFuncResult test_wapp_file_seek(void) {
wapp_file_write_array((GenericArray)src_array1, test_fp, wapp_array_count(src_array1)); wpFileWriteArray((WpArray)src_array1, test_fp, wpArrayCount(src_array1));
i64 seek_result = wapp_file_seek(test_fp, 0, WAPP_SEEK_END); i64 seek_result = wpFileSeek(test_fp, 0, WP_SEEK_END);
b8 result = seek_result == (i64)(wapp_array_count(src_array1) * wapp_array_item_size(src_array1)); b8 result = seek_result == (i64)(wpArrayCount(src_array1) * wpArrayItemSize(src_array1));
wapp_file_seek(test_fp, 0, WAPP_SEEK_START); wpFileSeek(test_fp, 0, WP_SEEK_START);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_wapp_file_get_length(void) { WpTestFuncResult test_wapp_file_get_length(void) {
i64 length = wapp_file_get_length(test_fp); i64 length = wpFileGetLength(test_fp);
return wapp_tester_result(length == (i64)(wapp_array_count(src_array1) * wapp_array_item_size(src_array1))); return wpTesterResult(length == (i64)(wpArrayCount(src_array1) * wpArrayItemSize(src_array1)));
} }
TestFuncResult test_wapp_file_read(void) { WpTestFuncResult test_wapp_file_read(void) {
wapp_file_seek(test_fp, 0, WAPP_SEEK_START); wpFileSeek(test_fp, 0, WP_SEEK_START);
u64 byte_count = DST_CAPACITY * sizeof(i32); u64 byte_count = DST_CAPACITY * sizeof(i32);
u64 count = wapp_file_read((void *)dst_buf, test_fp, byte_count); u64 count = wpFileRead((void *)dst_buf, test_fp, byte_count);
b8 result = count == byte_count; b8 result = count == byte_count;
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of // NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
@@ -52,67 +52,67 @@ TestFuncResult test_wapp_file_read(void) {
u64 index = 0; u64 index = 0;
b8 running = true; b8 running = true;
while (running) { while (running) {
result = result && (dst_buf[index] == *wapp_array_get(i32, src_array1, index)); result = result && (dst_buf[index] == *wpArrayGet(i32, src_array1, index));
++index; ++index;
running = index < DST_CAPACITY; running = index < DST_CAPACITY;
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_wapp_file_write(void) { WpTestFuncResult test_wapp_file_write(void) {
wapp_file_seek(test_fp, 0, WAPP_SEEK_END); wpFileSeek(test_fp, 0, WP_SEEK_END);
u64 expected_count = wapp_array_count(src_array2) * wapp_array_item_size(src_array2); u64 expected_count = wpArrayCount(src_array2) * wpArrayItemSize(src_array2);
i64 count = wapp_file_write((void *)src_array2, test_fp, expected_count); i64 count = wpFileWrite((void *)src_array2, test_fp, expected_count);
return wapp_tester_result(count >= 0 && (u64)count == expected_count); return wpTesterResult(count >= 0 && (u64)count == expected_count);
} }
TestFuncResult test_wapp_file_read_array(void) { WpTestFuncResult test_wapp_file_read_array(void) {
wapp_file_seek(test_fp, 0, WAPP_SEEK_START); wpFileSeek(test_fp, 0, WP_SEEK_START);
u64 count = wapp_file_read_array((GenericArray)dst_array, test_fp, wapp_array_count(src_array1)); u64 count = wpFileReadArray((WpArray)dst_array, test_fp, wpArrayCount(src_array1));
b8 result = count == wapp_array_count(src_array1) && b8 result = count == wpArrayCount(src_array1) &&
wapp_array_count(dst_array) == wapp_array_count(src_array1); wpArrayCount(dst_array) == wpArrayCount(src_array1);
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of // NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
// MSVC Spectre mitigation warnings // MSVC Spectre mitigation warnings
u64 index = 0; u64 index = 0;
b8 running = true; b8 running = true;
while (running) { while (running) {
result = result && (*wapp_array_get(i32, dst_array, index) == *wapp_array_get(i32, src_array1, index)); result = result && (*wpArrayGet(i32, dst_array, index) == *wpArrayGet(i32, src_array1, index));
++index; ++index;
running = index < wapp_array_count(dst_array); running = index < wpArrayCount(dst_array);
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_wapp_file_write_array(void) { WpTestFuncResult test_wapp_file_write_array(void) {
wapp_file_seek(test_fp, 0, WAPP_SEEK_END); wpFileSeek(test_fp, 0, WP_SEEK_END);
i64 count = wapp_file_write_array((GenericArray)src_array3, test_fp, wapp_array_count(src_array3)); i64 count = wpFileWriteArray((WpArray)src_array3, test_fp, wpArrayCount(src_array3));
return wapp_tester_result(count >= 0 && (u64)count == wapp_array_count(src_array3)); return wpTesterResult(count >= 0 && (u64)count == wpArrayCount(src_array3));
} }
TestFuncResult test_wapp_file_flush(void) { WpTestFuncResult test_wapp_file_flush(void) {
i32 flush_result = wapp_file_flush(test_fp); i32 flush_result = wpFileFlush(test_fp);
return wapp_tester_result(flush_result == 0); return wpTesterResult(flush_result == 0);
} }
TestFuncResult test_wapp_file_close(void) { WpTestFuncResult test_wapp_file_close(void) {
i32 close_result = wapp_file_close(test_fp); i32 close_result = wpFileClose(test_fp);
return wapp_tester_result(close_result == 0); return wpTesterResult(close_result == 0);
} }
TestFuncResult test_wapp_file_rename(void) { WpTestFuncResult test_wapp_file_rename(void) {
i32 rename_result = wapp_file_rename(&test_filename, &new_filename); i32 rename_result = wpFileRename(&test_filename, &new_filename);
return wapp_tester_result(rename_result == 0); return wpTesterResult(rename_result == 0);
} }
TestFuncResult test_wapp_file_remove(void) { WpTestFuncResult test_wapp_file_remove(void) {
i32 remove_result = wapp_file_remove(&new_filename); i32 remove_result = wpFileRemove(&new_filename);
return wapp_tester_result(remove_result == 0); return wpTesterResult(remove_result == 0);
} }
+63 -63
View File
@@ -3,52 +3,52 @@
#include "test_file.h" #include "test_file.h"
#define DST_CAPACITY 5 #define DST_CAPACITY 5
wapp_intern Allocator arena = {}; wp_intern WpAllocator arena = {};
wapp_intern Str8RO test_filename = wapp_str8_lit_ro_initialiser_list("wapptest.bin"); wp_intern WpStr8RO test_filename = wpStr8LitRoInitialiserList("wapptest.bin");
wapp_intern Str8RO new_filename = wapp_str8_lit_ro_initialiser_list("wapptest2.bin"); wp_intern WpStr8RO new_filename = wpStr8LitRoInitialiserList("wapptest2.bin");
wapp_intern WFile *test_fp = NULL; wp_intern WpFile *test_fp = NULL;
wapp_intern i32 dst_buf[DST_CAPACITY] = {0}; wp_intern i32 dst_buf[DST_CAPACITY] = {0};
wapp_intern I32Array src_array1; wp_intern WpI32Array src_array1;
wapp_intern I32Array src_array2; wp_intern WpI32Array src_array2;
wapp_intern I32Array src_array3; wp_intern WpI32Array src_array3;
wapp_intern I32Array dst_array ; wp_intern WpI32Array dst_array ;
TestFuncResult test_wapp_file_open(void) { WpTestFuncResult test_wapp_file_open(void) {
arena = wapp_mem_arena_allocator_init(KiB(16)); arena = wpMemArenaAllocatorInit(KiB(16));
src_array1 = wapp_array(i32, 0, 1, 2, 3, 4); src_array1 = wpArray(i32, 0, 1, 2, 3, 4);
src_array2 = wapp_array(i32, 5, 6, 7, 8, 9); src_array2 = wpArray(i32, 5, 6, 7, 8, 9);
src_array3 = wapp_array(i32, 10, 11, 12, 13, 14); src_array3 = wpArray(i32, 10, 11, 12, 13, 14);
dst_array = wapp_array_with_capacity(i32, DST_CAPACITY, false); dst_array = wpArrayWithCapacity(i32, DST_CAPACITY, false);
test_fp = wapp_file_open(&arena, &test_filename, WAPP_ACCESS_WRITE_EX); test_fp = wpFileOpen(&arena, &test_filename, WP_ACCESS_WRITE_EX);
return wapp_tester_result(test_fp != NULL); return wpTesterResult(test_fp != NULL);
} }
TestFuncResult test_wapp_file_get_current_position(void) { WpTestFuncResult test_wapp_file_get_current_position(void) {
i64 pos = wapp_file_get_current_position(test_fp); i64 pos = wpFileGetCurrentPosition(test_fp);
return wapp_tester_result(pos == 0); return wpTesterResult(pos == 0);
} }
TestFuncResult test_wapp_file_seek(void) { WpTestFuncResult test_wapp_file_seek(void) {
wapp_file_write_array((GenericArray)src_array1, test_fp, wapp_array_count(src_array1)); wpFileWriteArray((WpArray)src_array1, test_fp, wpArrayCount(src_array1));
i64 seek_result = wapp_file_seek(test_fp, 0, WAPP_SEEK_END); i64 seek_result = wpFileSeek(test_fp, 0, WP_SEEK_END);
b8 result = seek_result == (i64)(wapp_array_count(src_array1) * wapp_array_item_size(src_array1)); b8 result = seek_result == (i64)(wpArrayCount(src_array1) * wpArrayItemSize(src_array1));
wapp_file_seek(test_fp, 0, WAPP_SEEK_START); wpFileSeek(test_fp, 0, WP_SEEK_START);
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_wapp_file_get_length(void) { WpTestFuncResult test_wapp_file_get_length(void) {
i64 length = wapp_file_get_length(test_fp); i64 length = wpFileGetLength(test_fp);
return wapp_tester_result(length == (i64)(wapp_array_count(src_array1) * wapp_array_item_size(src_array1))); return wpTesterResult(length == (i64)(wpArrayCount(src_array1) * wpArrayItemSize(src_array1)));
} }
TestFuncResult test_wapp_file_read(void) { WpTestFuncResult test_wapp_file_read(void) {
wapp_file_seek(test_fp, 0, WAPP_SEEK_START); wpFileSeek(test_fp, 0, WP_SEEK_START);
u64 byte_count = DST_CAPACITY * sizeof(i32); u64 byte_count = DST_CAPACITY * sizeof(i32);
u64 count = wapp_file_read((void *)dst_buf, test_fp, byte_count); u64 count = wpFileRead((void *)dst_buf, test_fp, byte_count);
b8 result = count == byte_count; b8 result = count == byte_count;
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of // NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
@@ -56,67 +56,67 @@ TestFuncResult test_wapp_file_read(void) {
u64 index = 0; u64 index = 0;
b8 running = true; b8 running = true;
while (running) { while (running) {
result = result && (dst_buf[index] == *wapp_array_get(i32, src_array1, index)); result = result && (dst_buf[index] == *wpArrayGet(i32, src_array1, index));
++index; ++index;
running = index < DST_CAPACITY; running = index < DST_CAPACITY;
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_wapp_file_write(void) { WpTestFuncResult test_wapp_file_write(void) {
wapp_file_seek(test_fp, 0, WAPP_SEEK_END); wpFileSeek(test_fp, 0, WP_SEEK_END);
u64 expected_count = wapp_array_count(src_array2) * wapp_array_item_size(src_array2); u64 expected_count = wpArrayCount(src_array2) * wpArrayItemSize(src_array2);
i64 count = wapp_file_write((void *)src_array2, test_fp, expected_count); i64 count = wpFileWrite((void *)src_array2, test_fp, expected_count);
return wapp_tester_result(count >= 0 && (u64)count == expected_count); return wpTesterResult(count >= 0 && (u64)count == expected_count);
} }
TestFuncResult test_wapp_file_read_array(void) { WpTestFuncResult test_wapp_file_read_array(void) {
wapp_file_seek(test_fp, 0, WAPP_SEEK_START); wpFileSeek(test_fp, 0, WP_SEEK_START);
u64 count = wapp_file_read_array((GenericArray)dst_array, test_fp, wapp_array_count(src_array1)); u64 count = wpFileReadArray((WpArray)dst_array, test_fp, wpArrayCount(src_array1));
b8 result = count == wapp_array_count(src_array1) && b8 result = count == wpArrayCount(src_array1) &&
wapp_array_count(dst_array) == wapp_array_count(src_array1); wpArrayCount(dst_array) == wpArrayCount(src_array1);
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of // NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
// MSVC Spectre mitigation warnings // MSVC Spectre mitigation warnings
u64 index = 0; u64 index = 0;
b8 running = true; b8 running = true;
while (running) { while (running) {
result = result && (*wapp_array_get(i32, dst_array, index) == *wapp_array_get(i32, src_array1, index)); result = result && (*wpArrayGet(i32, dst_array, index) == *wpArrayGet(i32, src_array1, index));
++index; ++index;
running = index < wapp_array_count(dst_array); running = index < wpArrayCount(dst_array);
} }
return wapp_tester_result(result); return wpTesterResult(result);
} }
TestFuncResult test_wapp_file_write_array(void) { WpTestFuncResult test_wapp_file_write_array(void) {
wapp_file_seek(test_fp, 0, WAPP_SEEK_END); wpFileSeek(test_fp, 0, WP_SEEK_END);
i64 count = wapp_file_write_array((GenericArray)src_array3, test_fp, wapp_array_count(src_array3)); i64 count = wpFileWriteArray((WpArray)src_array3, test_fp, wpArrayCount(src_array3));
return wapp_tester_result(count >= 0 && (u64)count == wapp_array_count(src_array3)); return wpTesterResult(count >= 0 && (u64)count == wpArrayCount(src_array3));
} }
TestFuncResult test_wapp_file_flush(void) { WpTestFuncResult test_wapp_file_flush(void) {
i32 flush_result = wapp_file_flush(test_fp); i32 flush_result = wpFileFlush(test_fp);
return wapp_tester_result(flush_result == 0); return wpTesterResult(flush_result == 0);
} }
TestFuncResult test_wapp_file_close(void) { WpTestFuncResult test_wapp_file_close(void) {
i32 close_result = wapp_file_close(test_fp); i32 close_result = wpFileClose(test_fp);
return wapp_tester_result(close_result == 0); return wpTesterResult(close_result == 0);
} }
TestFuncResult test_wapp_file_rename(void) { WpTestFuncResult test_wapp_file_rename(void) {
i32 rename_result = wapp_file_rename(&test_filename, &new_filename); i32 rename_result = wpFileRename(&test_filename, &new_filename);
return wapp_tester_result(rename_result == 0); return wpTesterResult(rename_result == 0);
} }
TestFuncResult test_wapp_file_remove(void) { WpTestFuncResult test_wapp_file_remove(void) {
i32 remove_result = wapp_file_remove(&new_filename); i32 remove_result = wpFileRemove(&new_filename);
return wapp_tester_result(remove_result == 0); return wpTesterResult(remove_result == 0);
} }

Some files were not shown because too many files have changed in this diff Show More