80 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
abdelrahman c67a448d00 Add basic logging functionality
Release / release (push) Successful in 6s
2026-05-17 18:40:10 +01:00
abdelrahman 2e5163ba33 Implement functions to get stdin, stdout & stderr
Release / release (push) Successful in 2s
2026-05-17 12:21:23 +01:00
abdelrahman 515493b963 Fix queue MSVC errors 2026-05-17 12:20:47 +01:00
abdelrahman 8061692801 Add standard streams
Release / release (push) Successful in 3s
2026-05-17 11:13:40 +01:00
abdelrahman 70997f091f Avoid wrapping whole Makefile in bear
Release / release (push) Successful in 6s
2026-05-17 10:17:54 +01:00
abdelrahman f61cb3cae0 Minor shell commander tweaks 2026-05-17 10:17:36 +01:00
abdelrahman 946bcc9b59 Replace extern 2026-05-17 09:44:11 +01:00
abdelrahman 7ffebe7dce Fix missing semi-colon
Release / release (push) Successful in 3s
2026-05-10 02:22:46 +01:00
abdelrahman 9c727950d8 Call UUID lambdas
Release / release (push) Successful in 3s
2026-05-10 02:21:38 +01:00
abdelrahman c7c4f88866 Fix wapp_uuid_gen_uuid4 for C++
Release / release (push) Successful in 5s
2026-05-10 02:19:34 +01:00
abdelrahman 6346765e32 Fix UUID for C++
Release / release (push) Successful in 5s
2026-05-10 02:13:41 +01:00
Abdelrahman Said 270dbfe5ca Update README
Release / release (push) Successful in 7s
2026-03-09 22:32:04 +00:00
Abdelrahman Said 7fd808fe7b Add LICENSE file
Release / release (push) Successful in 11s
2026-03-09 22:17:05 +00:00
140 changed files with 8874 additions and 3521 deletions
+28 -10
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 }}"
RESPONSE=$(jq -n \
--arg tag "v$VERSION" \
--arg name "wapp-v$VERSION" \
--rawfile body "$CHANGELOG_FILE" \
'{tag_name: $tag, name: $name, body: $body, draft: false, prerelease: false}' \
| curl -s -X POST \
-H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \ -H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
"https://git.thewizardapprentice.com/api/v1/repos/${{ gitea.repository }}/releases" \ --data-binary @- \
-d '{ "https://git.thewizardapprentice.com/api/v1/repos/${{ gitea.repository }}/releases")
"tag_name": "v'"$VERSION"'",
"name": "wapp-v'"$VERSION"'",
"body": "Automated release for wapp-v'"$VERSION"'",
"draft": false,
"prerelease": false
}')
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`
+201
View File
@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [2026] [Abdelrahman Said]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+11 -7
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
@@ -153,7 +157,7 @@ builddir:
@mkdir -p "$(BUILD_DIR)" @mkdir -p "$(BUILD_DIR)"
build-c-test: build-c-test:
$(CC) $(CSTD) $(CFLAGS) $(BUILD_FLAGS) $(TEST_INCLUDE) $(TEST_C_SRC) -o "$(TEST_C_OUT)" bear -- $(CC) $(CSTD) $(CFLAGS) $(BUILD_FLAGS) $(TEST_INCLUDE) $(TEST_C_SRC) -o "$(TEST_C_OUT)"
run-c-test: build-c-test run-c-test: build-c-test
@echo -e "\n\033[34;1mRUNNING C TESTS\033[0m" @echo -e "\n\033[34;1mRUNNING C TESTS\033[0m"
@@ -161,7 +165,7 @@ run-c-test: build-c-test
@rm "$(TEST_C_OUT)" @rm "$(TEST_C_OUT)"
build-cc-test: build-cc-test:
$(CXX) $(CXXSTD) $(CFLAGS) $(BUILD_FLAGS) $(TEST_INCLUDE) $(TEST_CXX_SRC) "$(LIB_OUT)" -o "$(TEST_CXX_OUT)" bear -a -- $(CXX) $(CXXSTD) $(CFLAGS) $(BUILD_FLAGS) $(TEST_INCLUDE) $(TEST_CXX_SRC) "$(LIB_OUT)" -o "$(TEST_CXX_OUT)"
run-cc-test: build-cc-test run-cc-test: build-cc-test
@echo -e "\n\033[34;1mRUNNING C++ TESTS\033[0m" @echo -e "\n\033[34;1mRUNNING C++ TESTS\033[0m"
@@ -175,6 +179,6 @@ install: build-lib
@bash $(HEADER_INSTALL_CMD) $(LIB_SRC) "$(INCLUDE_INSTALL)" $(INCLUDES) @bash $(HEADER_INSTALL_CMD) $(LIB_SRC) "$(INCLUDE_INSTALL)" $(INCLUDES)
build-lib: builddir build-lib: builddir
$(CC) -c $(CSTD) $(CFLAGS) $(BUILD_FLAGS) $(LIBFLAGS) $(LIB_SRC) -o "$(OBJ_OUT)" bear -a -- $(CC) -c $(CSTD) $(CFLAGS) $(BUILD_FLAGS) $(LIBFLAGS) $(LIB_SRC) -o "$(OBJ_OUT)"
$(AR) r "$(LIB_OUT)" "$(OBJ_OUT)" $(AR) r "$(LIB_OUT)" "$(OBJ_OUT)"
@rm "$(OBJ_OUT)" @rm "$(OBJ_OUT)"
+3 -1
View File
@@ -1,3 +1,5 @@
# Wizard Apprentice Standard Library # Wizard Apprentice Standard Library
A group of utilities for C/C++ projects **Wizard Apprentice Standard Library** (`wapp`) is a lightweight collection of reusable utilities for **C and C++** projects.
For more information about the library and how to use it, check the [wiki](https://git.thewizardapprentice.com/abdelrahman/wizapp-stdlib/wiki).
+1 -1
View File
@@ -1 +1 @@
1.0.0 2.5.0
+1 -1
View File
@@ -55,4 +55,4 @@ if ! contains ${BUILD_TYPE} "${ACCEPTED_BUILD_TYPES[@]}"; then
exit 1 exit 1
fi fi
bear -- make BUILD_TYPE=$BUILD_TYPE $ARGS make BUILD_TYPE=$BUILD_TYPE $ARGS
+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()
+157 -113
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);
} }
+134 -127
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))) sizeof(TYPE)))
#define wapp_array_set(TYPE, ARRAY, INDEX, VALUE_PTR) \ #define wpArraySet(TYPE, ARRAY, INDEX, VALUE_PTR) \
(_array_set((GenericArray)ARRAY, \ (arraySet((WpArray)ARRAY, \
INDEX, \ INDEX, \
(u8 *)VALUE_PTR, \ (u8 *)VALUE_PTR, \
sizeof(TYPE))) sizeof(TYPE)))
#define wapp_array_append_capped(TYPE, ARRAY, VALUE_PTR) \ #define wpArrayAppendCapped(TYPE, ARRAY, VALUE_PTR) \
(_array_append_capped((GenericArray)ARRAY, \ (arrayAppendCapped((WpArray)ARRAY, \
(u8 *)VALUE_PTR, \ (u8 *)VALUE_PTR, \
sizeof(TYPE))) sizeof(TYPE)))
#define wapp_array_extend_capped(TYPE, DST_ARRAY, SRC_ARRAY) \ #define wpArrayExtendCapped(TYPE, DST_ARRAY, SRC_ARRAY) \
(_array_extend_capped((GenericArray)DST_ARRAY, \ (arrayExtendCappend((WpArray)DST_ARRAY, \
(GenericArray)SRC_ARRAY, \ (WpArray)SRC_ARRAY, \
sizeof(TYPE))) sizeof(TYPE)))
#define wapp_array_copy_capped(TYPE, DST_ARRAY, SRC_ARRAY) \ #define wpArrayCopyCapped(TYPE, DST_ARRAY, SRC_ARRAY) \
(_array_copy_capped((GenericArray)DST_ARRAY, \ (arrayCopyCapped((WpArray)DST_ARRAY, \
(GenericArray)SRC_ARRAY, \ (WpArray)SRC_ARRAY, \
sizeof(TYPE))) sizeof(TYPE)))
#define wapp_array_append_alloc(TYPE, ALLOCATOR_PTR, ARRAY, VALUE_PTR, FLAGS) \ #define wpArrayAppendAlloc(TYPE, ALLOCATOR_PTR, ARRAY, VALUE_PTR, FLAGS) \
((TYPE *)_array_append_alloc(ALLOCATOR_PTR, \ ((TYPE *)arrayAppendAlloc(ALLOCATOR_PTR, \
(GenericArray)ARRAY, \ (WpArray)ARRAY, \
(u8 *)VALUE_PTR, \ (u8 *)VALUE_PTR, \
FLAGS, \ FLAGS, \
sizeof(TYPE))) sizeof(TYPE)))
#define wapp_array_extend_alloc(TYPE, ALLOCATOR_PTR, DST_ARRAY, SRC_ARRAY, FLAGS) \ #define wpArrayExtendAlloc(TYPE, ALLOCATOR_PTR, DST_ARRAY, SRC_ARRAY, FLAGS) \
((TYPE *)_array_extend_alloc(ALLOCATOR_PTR, \ ((TYPE *)arrayExtendAlloc(ALLOCATOR_PTR, \
(GenericArray)DST_ARRAY, \ (WpArray)DST_ARRAY, \
(GenericArray)SRC_ARRAY, \ (WpArray)SRC_ARRAY, \
FLAGS, \ FLAGS, \
sizeof(TYPE))) sizeof(TYPE)))
#define wapp_array_copy_alloc(TYPE, ALLOCATOR_PTR, DST_ARRAY, SRC_ARRAY, FLAGS) \ #define wpArrayCopyAlloc(TYPE, ALLOCATOR_PTR, DST_ARRAY, SRC_ARRAY, FLAGS) \
((TYPE *)_array_copy_alloc(ALLOCATOR_PTR, \ ((TYPE *)arrayCopyAlloc(ALLOCATOR_PTR, \
(GenericArray)DST_ARRAY, \ (WpArray)DST_ARRAY, \
(GenericArray)SRC_ARRAY, \ (WpArray)SRC_ARRAY, \
FLAGS, \ FLAGS, \
sizeof(TYPE))) sizeof(TYPE)))
#define wapp_array_clear(TYPE, ARRAY) \ #define wpArrayRemoveSwapEnd(TYPE, ARRAY, INDEX) arrayRemoveSwapEnd(ARRAY, INDEX, sizeof(TYPE))
(_array_clear((GenericArray)ARRAY, \ #define wpArrayZero(TYPE, ARRAY) (arrayZero((WpArray)ARRAY, sizeof(TYPE)))
sizeof(TYPE))) #define wpArrayClear(TYPE, ARRAY) (arrayClear((WpArray)ARRAY, sizeof(TYPE)))
#define wapp_array_calc_alloc_size(TYPE, CAPACITY) _array_calc_alloc_size(CAPACITY, sizeof(TYPE)) #define wpArrayCalcAllocSize(TYPE, CAPACITY) arrayCalcAllocSize(CAPACITY, sizeof(TYPE))
#define wapp_array_alloc_capacity(TYPE, ALLOCATOR_PTR, CAPACITY, FLAGS) \ #define wpArrayAllocCapacity(TYPE, ALLOCATOR_PTR, CAPACITY, FLAGS) \
((TYPE *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, FLAGS, sizeof(TYPE))) ((TYPE *)arrayAllocCapacity(ALLOCATOR_PTR, CAPACITY, FLAGS, sizeof(TYPE)))
#define wapp_array_from_preallcated_buffer(TYPE, BUFFER, BUFFER_SIZE) \ #define wpArrayFromPreallcatedBuffer(TYPE, BUFFER, BUFFER_SIZE) \
((TYPE *)_array_from_preallcated_buffer(BUFFER, BUFFER_SIZE, sizeof(TYPE))) ((TYPE *)array_from_preallcated_buffer(BUFFER, BUFFER_SIZE, sizeof(TYPE)))
// 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.
#define wpArrayDealloc(TYPE, ALLOCATOR_PTR, ARRAY_DPTR) \
(arrayDealloc(ALLOCATOR_PTR, (WpArray *)ARRAY_DPTR, 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 arrayCalcAllocSize(u64 capacity, u64 item_size);
WpArray arrayAllocCapacity(const WpAllocator *allocator, u64 capacity, WpArrayInitFlags flags,
u64 item_size); u64 item_size);
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);
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
+47 -24
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,27 +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);
if (queue->count >= capacity) {
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(capacity * 2); // NOTE (Abdelrahman): Extracted into variable to fix MSVC error
u64 array_size = _array_calc_alloc_size(new_capacity, item_size); b8 queue_full = queue->count >= capacity;
u64 alloc_size = sizeof(GenericQueue) + array_size; if (queue_full) {
void *buffer = wapp_mem_allocator_alloc(allocator, alloc_size); u64 new_capacity = wpMiscUtilsU64RoundUpPow2(capacity * 2);
u64 array_size = arrayCalcAllocSize(new_capacity, item_size);
u64 alloc_size = sizeof(WpQueue) + array_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
@@ -51,7 +54,27 @@ GenericQueue *_queue_push_alloc(const Allocator *allocator, GenericQueue *queue,
void *copy_boundary = (void *)((uptr)(queue->items) + (queue->front * item_size)); void *copy_boundary = (void *)((uptr)(queue->items) + (queue->front * item_size));
memcpy(output->items, copy_boundary, front_count * item_size); memcpy(output->items, copy_boundary, front_count * item_size);
if (back_count > 0) {
/**
* NOTE (Abdelrahman): Since this is a ring buffer, the elements at the beginning of the array
* aren't always the ones at the front of the queue. When that's the case, the memcpy above
* will only copy a subset of the elements. This is why we need to copy the remaining ones.
*
* Example: Take a queue that looks like this with a capacity of 5 elements
*
* 0 1 | 2 3 4
* ---------------|-----------------------
* | * | * | * | * | * |
* ---------------|-----------------------
* |
* queue_front = 2
* queue_back = 2
*
* In this case, the first memcpy will only copy elements 2-4. The memcpy below will be
* responsible for copying elements 0-1.
*/
b8 items_left_to_copy = back_count > 0;
if (items_left_to_copy) {
void *back_copy_dst = (void *)((uptr)(output->items) + (front_count * item_size)); void *back_copy_dst = (void *)((uptr)(output->items) + (front_count * item_size));
memcpy(back_copy_dst, queue->items, back_count * item_size); memcpy(back_copy_dst, queue->items, back_count * item_size);
} }
@@ -61,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;
} }
+61 -60
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 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) 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
+19 -10
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,7 +23,7 @@ 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))
@@ -31,7 +31,7 @@ BEGIN_C_LINKAGE
#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( \
@@ -47,17 +47,26 @@ BEGIN_C_LINKAGE
) + 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
+137
View File
@@ -0,0 +1,137 @@
// vim:fileencoding=utf-8:foldmethod=marker
#include "log.h"
#include "../base/strings/str8/str8.h"
#include "../common/aliases/aliases.h"
#include "../common/assert/assert.h"
#include "../common/misc/misc_utils.h"
#include "../os/file/file.h"
#include <time.h>
#define MIN_LOG_MSG_LENGTH 32
#define TIME_BUF_CAPACITY 70
wp_intern WpStr8RO L_BRACKET = wpStr8LitRo("[");
wp_intern WpStr8RO R_BRACKET_SPACE = wpStr8LitRo("] ");
wp_intern WpStr8RO R_BRACKET_NEWLINE = wpStr8LitRo("]\n");
typedef struct LogConfig {
WpFile *outlog;
WpFile *errlog;
WpLogLevel level;
wpMiscUtilsReservePadding(2 * sizeof(WpFile *) + sizeof(WpLogLevel));
} LogConfig;
wp_intern LogConfig LOG_CONFIG = {
.level = WP_LOG_LEVEL_DEBUG,
};
wp_intern WpStr8RO LOG_LEVEL_STRINGS[COUNT_LOG_LEVEL] = {
[WP_LOG_LEVEL_FATAL] = wpStr8LitRoInitialiserList("fatal "),
[WP_LOG_LEVEL_CRITICAL] = wpStr8LitRoInitialiserList("critical "),
[WP_LOG_LEVEL_ERROR] = wpStr8LitRoInitialiserList("error "),
[WP_LOG_LEVEL_WARNING] = wpStr8LitRoInitialiserList("warning "),
[WP_LOG_LEVEL_INFO] = wpStr8LitRoInitialiserList("info "),
[WP_LOG_LEVEL_DEBUG] = wpStr8LitRoInitialiserList("debug "),
};
wp_intern void getCurrentTimeString(WpStr8 *dst);
wp_intern void writeLogLine(WpFile *fp, const WpLogger *logger, WpStr8 msg, WpLogLevel level);
void wpLogSetLevel(WpLogLevel level) {
LOG_CONFIG.level = level;
}
void wpLogConfigure(WpFile *outlog, WpFile *errlog, WpLogLevel level) {
LOG_CONFIG.outlog = outlog;
LOG_CONFIG.errlog = errlog;
LOG_CONFIG.level = level;
}
WpLogger wpLogMakeLogger(WpStr8 name) {
return (WpLogger){ .name = name };
}
void wpLogDebug(const WpLogger *logger, WpStr8 msg) {
wpDebugAssert(logger != NULL, "`logger` should not be NULL");
if (LOG_CONFIG.level < WP_LOG_LEVEL_DEBUG) { return; }
WpFile *fp = LOG_CONFIG.outlog != NULL ? LOG_CONFIG.outlog : wpFileStdout();
writeLogLine(fp, logger, msg, WP_LOG_LEVEL_DEBUG);
}
void wpLogInfo(const WpLogger *logger, WpStr8 msg) {
wpDebugAssert(logger != NULL, "`logger` should not be NULL");
if (LOG_CONFIG.level < WP_LOG_LEVEL_INFO) { return; }
WpFile *fp = LOG_CONFIG.outlog != NULL ? LOG_CONFIG.outlog : wpFileStdout();
writeLogLine(fp, logger, msg, WP_LOG_LEVEL_INFO);
}
void wpLogWarning(const WpLogger *logger, WpStr8 msg) {
wpDebugAssert(logger != NULL, "`logger` should not be NULL");
if (LOG_CONFIG.level < WP_LOG_LEVEL_WARNING) { return; }
WpFile *fp = LOG_CONFIG.outlog != NULL ? LOG_CONFIG.outlog : wpFileStdout();
writeLogLine(fp, logger, msg, WP_LOG_LEVEL_WARNING);
}
void wpLogError(const WpLogger *logger, WpStr8 msg) {
wpDebugAssert(logger != NULL, "`logger` should not be NULL");
if (LOG_CONFIG.level < WP_LOG_LEVEL_ERROR) { return; }
WpFile *fp = LOG_CONFIG.errlog != NULL ? LOG_CONFIG.errlog : wpFileStderr();
writeLogLine(fp, logger, msg, WP_LOG_LEVEL_ERROR);
}
void wpLogCritical(const WpLogger *logger, WpStr8 msg) {
wpDebugAssert(logger != NULL, "`logger` should not be NULL");
if (LOG_CONFIG.level < WP_LOG_LEVEL_CRITICAL) { return; }
WpFile *fp = LOG_CONFIG.errlog != NULL ? LOG_CONFIG.errlog : wpFileStderr();
writeLogLine(fp, logger, msg, WP_LOG_LEVEL_CRITICAL);
}
void wpLogFatal(const WpLogger *logger, WpStr8 msg) {
wpDebugAssert(logger != NULL, "`logger` should not be NULL");
if (LOG_CONFIG.level < WP_LOG_LEVEL_FATAL) { return; }
WpFile *fp = LOG_CONFIG.errlog != NULL ? LOG_CONFIG.errlog : wpFileStderr();
writeLogLine(fp, logger, msg, WP_LOG_LEVEL_FATAL);
}
wp_intern void getCurrentTimeString(WpStr8 *dst) {
// TODO (Abdelrahman): Replace with proper date/time utilities
char buf[TIME_BUF_CAPACITY];
time_t now = time(NULL);
struct tm utc;
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);
}
}
+42
View File
@@ -0,0 +1,42 @@
// vim:fileencoding=utf-8:foldmethod=marker
#ifndef LOG_H
#define LOG_H
#include "../os/file/file.h"
#include "../base/strings/str8/str8.h"
#ifdef WP_PLATFORM_CPP
BEGIN_C_LINKAGE
#endif // !WP_PLATFORM_CPP
typedef enum WpLogLevel {
WP_LOG_LEVEL_FATAL,
WP_LOG_LEVEL_CRITICAL,
WP_LOG_LEVEL_ERROR,
WP_LOG_LEVEL_WARNING,
WP_LOG_LEVEL_INFO,
WP_LOG_LEVEL_DEBUG,
COUNT_LOG_LEVEL,
} WpLogLevel;
typedef struct WpLogger {
WpStr8 name;
} WpLogger;
void wpLogSetLevel(WpLogLevel level);
void wpLogConfigure(WpFile *outlog, WpFile *errlog, WpLogLevel level);
WpLogger wpLogMakeLogger(WpStr8 name);
void wpLogDebug(const WpLogger *logger, WpStr8 msg);
void wpLogInfo(const WpLogger *logger, WpStr8 msg);
void wpLogWarning(const WpLogger *logger, WpStr8 msg);
void wpLogError(const WpLogger *logger, WpStr8 msg);
void wpLogCritical(const WpLogger *logger, WpStr8 msg);
void wpLogFatal(const WpLogger *logger, WpStr8 msg);
#ifdef WP_PLATFORM_CPP
END_C_LINKAGE
#endif // !WP_PLATFORM_CPP
#endif // !LOG_H
+10
View File
@@ -0,0 +1,10 @@
// vim:fileencoding=utf-8:foldmethod=marker
#ifndef WAPP_LOG_C
#define WAPP_LOG_C
#include "log.c"
#include "../base/wapp_base.c"
#include "../os/wapp_os.c"
#endif // !WAPP_LOG_C
+11
View File
@@ -0,0 +1,11 @@
// vim:fileencoding=utf-8:foldmethod=marker
#ifndef WAPP_LOG_H
#define WAPP_LOG_H
#include "log.h"
#include "../common/wapp_common.h"
#include "../base/wapp_base.h"
#include "../os/wapp_os.h"
#endif // !WAPP_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);
} }
+56 -42
View File
@@ -7,57 +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;
WFile *wapp_file_open(const Allocator *allocator, Str8RO *filepath, FileAccessMode mode); // Return value should not be cached as it's not guaranteed to remain the same. Always call
i64 wapp_file_get_current_position(WFile *file); // wpFileStdin to get the standard input stream
i64 wapp_file_seek(WFile *file, i64 offset, FileSeekOrigin origin); wp_extern WpFile *wpFileStdin(void);
i64 wapp_file_get_length(WFile *file);
u64 wapp_file_read(void *dst_buf, WFile *file, u64 byte_count);
i64 wapp_file_write(const void *src_buf, WFile *file, u64 byte_count);
u64 wapp_file_read_array(GenericArray dst_buf, WFile *file, u64 item_count);
i64 wapp_file_write_array(const GenericArray src_buf, WFile *file, u64 item_count);
i32 wapp_file_flush(WFile *file);
i32 wapp_file_close(WFile *file);
i32 wapp_file_rename(Str8RO *old_filepath, Str8RO *new_filepath);
i32 wapp_file_remove(Str8RO *filepath);
extern WFile *_file_open(const Allocator *allocator, Str8RO *filepath, FileAccessMode mode); // Return value should not be cached as it's not guaranteed to remain the same. Always call
extern i64 _file_seek(WFile *file, i64 offset, FileSeekOrigin origin); // wpFileStdout to get the standard output stream
extern u64 _file_read(void *dst_buf, u64 byte_count, WFile *file, u64 file_length); wp_extern WpFile *wpFileStdout(void);
extern i64 _file_write(const void *src_buf, WFile *file, u64 byte_count);
extern i32 _file_flush(WFile *file);
extern i32 _file_close(WFile *file);
extern i32 _file_rename(Str8RO *old_filepath, Str8RO *new_filepath);
extern i32 _file_remove(Str8RO *filepath);
#ifdef WAPP_PLATFORM_CPP // Return value should not be cached as it's not guaranteed to remain the same. Always call
// wpFileStderr to get the standard error stream
wp_extern WpFile *wpFileStderr(void);
WpFile *wpFileOpen(const WpAllocator *allocator, WpStr8RO *filepath, WpFileAccessMode mode);
i64 wpFileGetCurrentPosition(WpFile *file);
i64 wpFileSeek(WpFile *file, i64 offset, WpFileSeekOrigin origin);
i64 wpFileGetLength(WpFile *file);
u64 wpFileRead(void *dst_buf, WpFile *file, u64 byte_count);
i64 wpFileWrite(const void *src_buf, WpFile *file, u64 byte_count);
u64 wpFileReadStr8(WpStr8 *str, WpFile *file);
i64 wpFileWriteStr8(WpStr8RO *str, WpFile *file);
u64 wpFileReadArray(WpArray dst_buf, WpFile *file, u64 item_count);
i64 wpFileWriteArray(const WpArray src_buf, WpFile *file, u64 item_count);
i32 wpFileFlush(WpFile *file);
i32 wpFileClose(WpFile *file);
i32 wpFileRename(WpStr8RO *old_filepath, WpStr8RO *new_filepath);
i32 wpFileRemove(WpStr8RO *filepath);
wp_extern WpFile *fileOpen(const WpAllocator *allocator, WpStr8RO *filepath, WpFileAccessMode mode);
wp_extern i64 fileSeek(WpFile *file, i64 offset, WpFileSeekOrigin origin);
wp_extern u64 fileRead(void *dst_buf, u64 byte_count, WpFile *file, u64 file_length);
wp_extern i64 fileWrite(const void *src_buf, WpFile *file, u64 byte_count);
wp_extern i32 fileFlush(WpFile *file);
wp_extern i32 fileClose(WpFile *file);
wp_extern i32 fileRename(WpStr8RO *old_filepath, WpStr8RO *new_filepath);
wp_extern i32 fileRemove(WpStr8RO *filepath);
#ifdef WP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WP_PLATFORM_CPP
#endif // !FILE_H #endif // !FILE_H
+59 -44
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,47 +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 *_file_open(const Allocator *allocator, Str8RO *filepath, FileAccessMode mode) { WpFile *wpFileStdin(void) {
wapp_persist c8 tmp[WAPP_PATH_MAX] = {0}; wp_persist WpFile _stdin = { .fd = STDIN_FILENO };
memset(tmp, 0, WAPP_PATH_MAX); return &_stdin;
}
WpFile *wpFileStdout(void) {
wp_persist WpFile _stdout = { .fd = STDOUT_FILENO };
return &_stdout;
}
WpFile *wpFileStderr(void) {
wp_persist WpFile _stderr = { .fd = STDERR_FILENO };
return &_stderr;
}
WpFile *fileOpen(const WpAllocator *allocator, WpStr8RO *filepath, WpFileAccessMode mode) {
wp_persist c8 tmp[WP_PATH_MAX] = {0};
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]);
@@ -59,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;
} }
@@ -67,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);
@@ -80,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
+70 -52
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,48 +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 *_file_open(const Allocator *allocator, Str8RO *filepath, FileAccessMode mode) { WpFile *wpFileStdin(void) {
wapp_persist c8 tmp[WAPP_PATH_MAX] = {0}; wp_persist WpFile _stdin = { .fh = INVALID_HANDLE_VALUE };
memset(tmp, 0, WAPP_PATH_MAX); _stdin.fh = GetStdHandle(STD_INPUT_HANDLE);
return &_stdin;
}
WpFile *wpFileStdout(void) {
wp_persist WpFile _stdout = { .fh = INVALID_HANDLE_VALUE };
_stdout.fh = GetStdHandle(STD_OUTPUT_HANDLE);
return &_stdout;
}
WpFile *wpFileStderr(void) {
wp_persist WpFile _stderr = { .fh = INVALID_HANDLE_VALUE };
_stderr.fh = GetStdHandle(STD_ERROR_HANDLE);
return &_stderr;
}
WpFile *fileOpen(const WpAllocator *allocator, WpStr8RO *filepath, WpFileAccessMode mode) {
wp_persist c8 tmp[WP_PATH_MAX] = {0};
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,
@@ -70,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;
} }
@@ -78,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};
@@ -91,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)) {
@@ -103,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)) {
@@ -113,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;
} }
@@ -121,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;
} }
@@ -129,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)) {
@@ -144,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)) {
@@ -156,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
+38 -38
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(u8), 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;
} }
+9 -7
View File
@@ -10,18 +10,20 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#ifdef WAPP_PLATFORM_CPP // TODO (Abdelrahman): This module needs rethinking
#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);
} }
+9 -7
View File
@@ -8,17 +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
void wapp_shell_termcolour_print_text(Str8RO *text, TerminalColour colour); // TODO (Abdelrahman): Look into moving away from stdio in the implementation
void wapp_shell_termcolour_clear_colour(void);
wapp_extern void print_coloured_text(Str8RO *text, TerminalColour colour); void wpShellTermcolourPrintText(WpStr8RO *text, WpTerminalColour colour);
void wpShellTermcolourClearColour(void);
#ifdef WAPP_PLATFORM_CPP wp_extern void printColouredText(WpStr8RO *text, WpTerminalColour colour);
#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);
} }
+24 -13
View File
@@ -7,33 +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
#define wapp_uuid_gen_uuid4() *(wapp_uuid_init_uuid4(&wapp_uuid_create())) #ifdef WP_PLATFORM_CPP
#define wpUuidGenUuid4() ([&](){ \
wp_persist WpUuid uuid = wpUuidCreate(); \
return *(wpUuidInitUuid4(&uuid)); \
}())
#else
#define wpUuidGenUuid4() *(wpUuidInitUuid4(&wpUuidCreate()))
#endif
/* Low level UUID API */ /* Low level UUID API */
#define wapp_uuid_create() ((WUUID){.uuid = wapp_str8_buf(UUID_BUF_LENGTH)}) #ifdef WP_PLATFORM_CPP
#define wpUuidCreate() ([&](){ return WpUuid{wpStr8Buf(WP_UUID_BUF_LENGTH)}; }())
#else
#define wpUuidCreate() ((WpUuid){.uuid = wpStr8Buf(WP_UUID_BUF_LENGTH)})
#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
+2 -1
View File
@@ -6,8 +6,9 @@
#include "wapp.h" #include "wapp.h"
#include "base/wapp_base.c" #include "base/wapp_base.c"
#include "os/wapp_os.c" #include "os/wapp_os.c"
#include "log/wapp_log.c"
#include "prng/wapp_prng.c" #include "prng/wapp_prng.c"
#include "uuid/uuid.c" #include "uuid/wapp_uuid.c"
#include "testing/wapp_testing.c" #include "testing/wapp_testing.c"
#endif // !WAPP_C #endif // !WAPP_C
+1
View File
@@ -6,6 +6,7 @@
#include "common/wapp_common.h" #include "common/wapp_common.h"
#include "base/wapp_base.h" #include "base/wapp_base.h"
#include "os/wapp_os.h" #include "os/wapp_os.h"
#include "log/wapp_log.h"
#include "prng/wapp_prng.h" #include "prng/wapp_prng.h"
#include "uuid/wapp_uuid.h" #include "uuid/wapp_uuid.h"
#include "testing/wapp_testing.h" #include "testing/wapp_testing.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);
} }

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