Compare commits
307 Commits
release-d2
...
release-d2
Author | SHA1 | Date | |
---|---|---|---|
65df731abb | |||
a098cb5ce7 | |||
8c0b0263db | |||
7f6c453345 | |||
261e324acd | |||
f5573e06da | |||
df87832324 | |||
d585794cbe | |||
209658549c | |||
02383a4aed | |||
185a76282a | |||
b722b4f701 | |||
459ab5aad9 | |||
565f621cfc | |||
9589ca9148 | |||
164db5007b | |||
cbfb167d29 | |||
e7b83be867 | |||
649da5fca8 | |||
aa095f7680 | |||
bb99c99f01 | |||
7f0dcdd280 | |||
6029ad5d47 | |||
26fe266b09 | |||
091eda7b44 | |||
9676ea5978 | |||
de8ac10653 | |||
88a6cd59f3 | |||
cd43fb7f38 | |||
136f422401 | |||
e773d6f0ee | |||
7da2f68d30 | |||
d20889aef1 | |||
50c8302f4a | |||
d8195d300d | |||
a8c1387d5a | |||
ff1e8f260b | |||
d4329981e7 | |||
0003454311 | |||
8c6b2234ec | |||
aad4b8a44c | |||
7cab133127 | |||
640ac85de4 | |||
b8d7658626 | |||
2503bb3b2c | |||
e5dd448fe7 | |||
4770bb6a93 | |||
c0bac696dc | |||
95f7c33419 | |||
535d8876d3 | |||
845e433221 | |||
5169a607cf | |||
8f03af99a7 | |||
ee63a4a1e4 | |||
ac29f7a0f2 | |||
89ae226b1d | |||
477834ac04 | |||
97b707b61c | |||
e86180e842 | |||
035ba8810f | |||
f1c2113dd3 | |||
56b79f414d | |||
844656d557 | |||
849aceb86d | |||
eef51a6d2b | |||
c84b85102c | |||
3fe62464c3 | |||
db55fc722f | |||
2094450898 | |||
889bec04b1 | |||
ac1e34d4cd | |||
55ed75f44d | |||
2751872c59 | |||
2a3cd35cc4 | |||
b66f459f75 | |||
3910f4e77c | |||
c0e96216ae | |||
f9512d72e8 | |||
b7f2c169ec | |||
1e5057d6e6 | |||
c6255e3224 | |||
02230ef619 | |||
9b6b60e4d1 | |||
b9a26ab61e | |||
a521887ddd | |||
5ca7e2f226 | |||
125a235dd1 | |||
91a7129f8f | |||
df48a232ec | |||
ab11b885e6 | |||
36fc25fb7e | |||
4803cca334 | |||
6bd74611cd | |||
c3f9cf9a64 | |||
646ab1283f | |||
74cf055610 | |||
0d8ba1b154 | |||
20edbb7f38 | |||
6febc7cc73 | |||
b94d6b5061 | |||
b3952cabbc | |||
2ffc11b04e | |||
96cace2cbb | |||
472f5702bd | |||
c0ac4345d3 | |||
fbebf4ef83 | |||
20513f7749 | |||
25a7873ea2 | |||
d0a32e247e | |||
03d4a5736e | |||
a2e41e6527 | |||
40a7caff90 | |||
26fc5565e8 | |||
388541ce32 | |||
6c194667b9 | |||
62d0579f40 | |||
202595b2a6 | |||
cb21ff3f04 | |||
2a8e3c2dc4 | |||
998066d377 | |||
fefb876fe7 | |||
5979e9885e | |||
a17abe4639 | |||
d62f913855 | |||
12bb7475fc | |||
df2c7e2b67 | |||
713aec887b | |||
3089cd7afc | |||
00638bc812 | |||
e002109829 | |||
b4798fd2ab | |||
3c804bf62a | |||
d39d552bd9 | |||
b7202a2b0d | |||
4e27a4c1f5 | |||
4ef31762d0 | |||
8b22a8f339 | |||
d45ff05bcd | |||
671dd86206 | |||
0abadc1850 | |||
4e068d628c | |||
4461f99fa4 | |||
cd1f4bdaa3 | |||
4728699585 | |||
105a1e5559 | |||
1bc18e34a8 | |||
fb8d295fcb | |||
8459d3baea | |||
804d78e116 | |||
5351e9aa0a | |||
b5954f15c5 | |||
5dce9dd377 | |||
0570f76236 | |||
e22b658a67 | |||
56b9cb6ebf | |||
eaa9a2415e | |||
95256a9a0d | |||
2286238abc | |||
13f0bf57e4 | |||
8eb1ac215b | |||
e132f2fd1b | |||
12f6b22c8b | |||
6c858e0c4e | |||
c6b58f7c63 | |||
a22aafaf96 | |||
6298ac3a21 | |||
cd63afacfe | |||
2859183742 | |||
8d04af691e | |||
055165974e | |||
be51838775 | |||
1207dadee8 | |||
109e1898cc | |||
a24bf7ffb9 | |||
046834c2b9 | |||
f840240aac | |||
cfa91d3d39 | |||
f7a7a66a6a | |||
5145595d57 | |||
f01d303381 | |||
098c8cb844 | |||
04ad0f0264 | |||
695e7a4561 | |||
7d53028faf | |||
6c34198f58 | |||
7e3e046109 | |||
f63c58169f | |||
e40b11246d | |||
161194c8b2 | |||
48603ea2c5 | |||
e2f2a17315 | |||
e8a0ce88c5 | |||
82e2ea747f | |||
ff666eda9b | |||
0d8b82ba49 | |||
5598dfdd87 | |||
6ef462adcc | |||
9511cb5719 | |||
1cc1d561e2 | |||
d15a0df7da | |||
e1282b6bae | |||
5fe7c14ccb | |||
42165ba2d6 | |||
1af4da43ad | |||
4fa879a09e | |||
fd8f1a29c6 | |||
9fda2763ba | |||
cda23ac4af | |||
c36b244dd3 | |||
335d278f5e | |||
f987b02c65 | |||
3c056276c1 | |||
87e2fdefcf | |||
672b92b363 | |||
762a6517b2 | |||
d141154a45 | |||
6170647c0c | |||
48e45c7dd6 | |||
5d3d9229b7 | |||
d54e93d836 | |||
830f8fe3e4 | |||
7b638538aa | |||
2016f6e605 | |||
240effd305 | |||
6bc629e02c | |||
f6f2acd67b | |||
0146d38405 | |||
75d8e7bb89 | |||
6b53eaf6b1 | |||
16c32273ac | |||
1567a6e29d | |||
89d543bcbc | |||
d68e64931b | |||
1cbc576286 | |||
500b93562c | |||
800ca85176 | |||
cc466a9f1d | |||
9d1155843e | |||
a2139c09b2 | |||
a3e5f27ab8 | |||
643f95ec80 | |||
6924147686 | |||
6e2b4fa7b4 | |||
4e5c749918 | |||
66229de77f | |||
7eb37c5318 | |||
7a21b20711 | |||
894be237f2 | |||
92e9d9cbfc | |||
b29b9a9b3a | |||
721f844214 | |||
a3d6a58cc8 | |||
e598e7fe27 | |||
ba9e720f9f | |||
8e816a261f | |||
5b9929ab3d | |||
ceb54b3f1b | |||
8764444758 | |||
ce9a0b1fdb | |||
f7a468ea1e | |||
861d177a27 | |||
3936756b36 | |||
3e78ec3fe5 | |||
3c3d53b40c | |||
151d7c5736 | |||
4e4d8d2c3f | |||
03d1fd2857 | |||
6701decc91 | |||
6cff526647 | |||
dd50bd0249 | |||
55a1660242 | |||
ed365dfef5 | |||
23a09e4a13 | |||
b69e7ebb98 | |||
418d6e3f22 | |||
c44d8678cb | |||
eb4cd7106d | |||
d259770f32 | |||
80bad608f7 | |||
2bce9a2baf | |||
791b7746f3 | |||
842e3587fd | |||
318e79004b | |||
9f338a7429 | |||
645e48af7b | |||
ef92c8df13 | |||
849d50be8e | |||
845092f114 | |||
75819a1797 | |||
d66da85753 | |||
98ddb08abd | |||
8d1701b0bb | |||
1048e522fd | |||
ee59da4aa3 | |||
1ba64cb5d8 | |||
462bebf6dd | |||
e3f84c4e75 | |||
6837a0556d | |||
ede2c8ca37 | |||
f50367f7d5 | |||
e758e03d2b | |||
835e3270ce | |||
480dd5ece4 | |||
dba6bb5800 | |||
40a456e54a | |||
bf5be00c12 | |||
dc7c2559d6 |
@ -4,7 +4,7 @@ on: [push]
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: nostalgia
|
runs-on: olympic
|
||||||
steps:
|
steps:
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
@ -17,3 +17,10 @@ jobs:
|
|||||||
- run: make purge configure-release
|
- run: make purge configure-release
|
||||||
- run: make build
|
- run: make build
|
||||||
- run: make test
|
- run: make test
|
||||||
|
- run: make install
|
||||||
|
- run: mv dist/linux-x86_64-release nostalgia-linux-x86_64
|
||||||
|
- run: tar cf nostalgia-linux-x86_64.tar nostalgia-linux-x86_64
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: nostalgia-linux-x86_64
|
||||||
|
path: nostalgia-linux-x86_64.tar
|
||||||
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -6,7 +6,7 @@
|
|||||||
.mypy_cache
|
.mypy_cache
|
||||||
.stfolder
|
.stfolder
|
||||||
.stignore
|
.stignore
|
||||||
scripts/__pycache__
|
util/scripts/__pycache__
|
||||||
pyenv
|
pyenv
|
||||||
CMakeLists.txt.user
|
CMakeLists.txt.user
|
||||||
ROM.oxfs
|
ROM.oxfs
|
||||||
|
32
Makefile
32
Makefile
@ -1,35 +1,49 @@
|
|||||||
BC_VAR_PROJECT_NAME=nostalgia
|
BC_VAR_PROJECT_NAME=nostalgia
|
||||||
BC_VAR_PROJECT_NAME_CAP=Nostalgia
|
BC_VAR_PROJECT_NAME_CAP=Nostalgia
|
||||||
|
BC_VAR_DEVENV_ROOT=util
|
||||||
BUILDCORE_PATH=deps/buildcore
|
BUILDCORE_PATH=deps/buildcore
|
||||||
include ${BUILDCORE_PATH}/base.mk
|
include ${BUILDCORE_PATH}/base.mk
|
||||||
|
|
||||||
ifeq ($(BC_VAR_OS),darwin)
|
ifeq ($(BC_VAR_OS),darwin)
|
||||||
NOSTALGIA_STUDIO=./build/${BC_VAR_CURRENT_BUILD}/bin/${BC_VAR_PROJECT_NAME_CAP}Studio.app/Contents/MacOS/${BC_VAR_PROJECT_NAME_CAP}Studio
|
PROJECT_STUDIO=./build/${BC_VAR_CURRENT_BUILD}/bin/${BC_VAR_PROJECT_NAME_CAP}Studio.app/Contents/MacOS/${BC_VAR_PROJECT_NAME_CAP}Studio
|
||||||
MGBA=/Applications/mGBA.app/Contents/MacOS/mGBA
|
MGBA=/Applications/mGBA.app/Contents/MacOS/mGBA
|
||||||
else
|
else
|
||||||
NOSTALGIA_STUDIO=./build/${BC_VAR_CURRENT_BUILD}/bin/${BC_VAR_PROJECT_NAME_CAP}Studio
|
PROJECT_STUDIO=./build/${BC_VAR_CURRENT_BUILD}/bin/${BC_VAR_PROJECT_NAME_CAP}Studio
|
||||||
MGBA=mgba-qt
|
MGBA=mgba-qt
|
||||||
endif
|
endif
|
||||||
|
PROJECT_PLAYER=./build/${BC_VAR_CURRENT_BUILD}/bin/${BC_VAR_PROJECT_NAME_CAP}
|
||||||
|
|
||||||
.PHONY: pkg-gba
|
.PHONY: pkg-gba
|
||||||
pkg-gba: build
|
pkg-gba: build
|
||||||
${BC_CMD_ENVRUN} ${BC_PY3} ./scripts/pkg-gba.py sample_project ${BC_VAR_PROJECT_NAME}
|
${BC_CMD_ENVRUN} ${BC_PY3} ./util/scripts/pkg-gba.py sample_project ${BC_VAR_PROJECT_NAME_CAP}
|
||||||
|
|
||||||
|
.PHONY: pkg-mac
|
||||||
|
pkg-mac: install
|
||||||
|
${BC_CMD_ENVRUN} ${BC_PY3} ./util/scripts/pkg-dmg.py
|
||||||
|
|
||||||
|
.PHONY: generate-studio-rsrc
|
||||||
|
generate-studio-rsrc:
|
||||||
|
${BC_CMD_ENVRUN} ${BC_PY3} ./util/scripts/file-to-cpp.py --rsrc src/olympic/studio/applib/src/rsrc.json
|
||||||
|
${BC_CMD_ENVRUN} ${BC_PY3} ./util/scripts/file-to-cpp.py --rsrc src/nostalgia/studio/rsrc.json
|
||||||
|
|
||||||
|
.PHONY: build-player
|
||||||
|
build-player:
|
||||||
|
${BC_CMD_CMAKE_BUILD} ${BC_VAR_BUILD_PATH} ${BC_VAR_PROJECT_NAME_CAP}
|
||||||
.PHONY: run
|
.PHONY: run
|
||||||
run: build
|
run: build-player
|
||||||
./build/${BC_VAR_CURRENT_BUILD}/bin/${BC_VAR_PROJECT_NAME} sample_project
|
${PROJECT_PLAYER} sample_project
|
||||||
.PHONY: run-studio
|
.PHONY: run-studio
|
||||||
run-studio: build
|
run-studio: build
|
||||||
${NOSTALGIA_STUDIO}
|
${PROJECT_STUDIO}
|
||||||
.PHONY: gba-run
|
.PHONY: gba-run
|
||||||
gba-run: pkg-gba
|
gba-run: pkg-gba
|
||||||
${MGBA} ${BC_VAR_PROJECT_NAME}.gba
|
${MGBA} ${BC_VAR_PROJECT_NAME_CAP}.gba
|
||||||
.PHONY: debug
|
.PHONY: debug
|
||||||
debug: build
|
debug: build
|
||||||
${BC_CMD_HOST_DEBUGGER} ./build/${BC_VAR_CURRENT_BUILD}/bin/${BC_VAR_PROJECT_NAME} sample_project
|
${BC_CMD_HOST_DEBUGGER} ${PROJECT_PLAYER} sample_project
|
||||||
.PHONY: debug-studio
|
.PHONY: debug-studio
|
||||||
debug-studio: build
|
debug-studio: build
|
||||||
${BC_CMD_HOST_DEBUGGER} ${NOSTALGIA_STUDIO}
|
${BC_CMD_HOST_DEBUGGER} ${PROJECT_STUDIO}
|
||||||
|
|
||||||
.PHONY: configure-gba
|
.PHONY: configure-gba
|
||||||
configure-gba:
|
configure-gba:
|
||||||
|
2
deps/buildcore/base.mk
vendored
2
deps/buildcore/base.mk
vendored
@ -93,7 +93,7 @@ purge:
|
|||||||
${BC_CMD_RM_RF} compile_commands.json
|
${BC_CMD_RM_RF} compile_commands.json
|
||||||
.PHONY: test
|
.PHONY: test
|
||||||
test: build
|
test: build
|
||||||
${BC_CMD_ENVRUN} mypy ${BC_VAR_SCRIPTS}
|
${BC_CMD_ENVRUN} ${BC_CMD_PY3} -m mypy ${BC_VAR_SCRIPTS}
|
||||||
${BC_CMD_CMAKE_BUILD} ${BC_VAR_BUILD_PATH} test
|
${BC_CMD_CMAKE_BUILD} ${BC_VAR_BUILD_PATH} test
|
||||||
.PHONY: test-verbose
|
.PHONY: test-verbose
|
||||||
test-verbose: build
|
test-verbose: build
|
||||||
|
7
deps/buildcore/scripts/pybb.py
vendored
7
deps/buildcore/scripts/pybb.py
vendored
@ -11,6 +11,7 @@
|
|||||||
# "Python Busy Box" - adds cross-platform equivalents to Unix commands that
|
# "Python Busy Box" - adds cross-platform equivalents to Unix commands that
|
||||||
# don't translate well to that other operating system
|
# don't translate well to that other operating system
|
||||||
|
|
||||||
|
import multiprocessing
|
||||||
import os
|
import os
|
||||||
import platform
|
import platform
|
||||||
import shutil
|
import shutil
|
||||||
@ -57,7 +58,11 @@ def cmake_build(base_path: str, target: Optional[str]) -> int:
|
|||||||
path = os.path.join(base_path, d)
|
path = os.path.join(base_path, d)
|
||||||
if not os.path.isdir(path):
|
if not os.path.isdir(path):
|
||||||
continue
|
continue
|
||||||
args = ['cmake', '--build', path]
|
args = ['cmake', '--build', path, f'-j{multiprocessing.cpu_count()}']
|
||||||
|
if path.endswith('release'):
|
||||||
|
args.append('--config=release')
|
||||||
|
elif path.endswith('debug'):
|
||||||
|
args.append('--config=debug')
|
||||||
if target is not None:
|
if target is not None:
|
||||||
args.extend(['--target', target])
|
args.extend(['--target', target])
|
||||||
err = subprocess.run(args).returncode
|
err = subprocess.run(args).returncode
|
||||||
|
2
deps/buildcore/scripts/util.py
vendored
2
deps/buildcore/scripts/util.py
vendored
@ -35,4 +35,6 @@ def get_arch() -> str:
|
|||||||
arch = platform.machine().lower()
|
arch = platform.machine().lower()
|
||||||
if arch == 'amd64':
|
if arch == 'amd64':
|
||||||
arch = 'x86_64'
|
arch = 'x86_64'
|
||||||
|
elif arch == 'aarch64':
|
||||||
|
arch = 'arm64'
|
||||||
return arch
|
return arch
|
||||||
|
4
deps/gbabuildcore/base.cmake
vendored
4
deps/gbabuildcore/base.cmake
vendored
@ -1,8 +1,8 @@
|
|||||||
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake/modules)
|
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake/modules)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostdlib")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostdlib")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostdinc++")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostdinc++")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-unwind-tables")
|
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-unwind-tables")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
|
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mthumb-interwork")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mthumb-interwork")
|
||||||
|
13
deps/glad/CMakeLists.txt
vendored
13
deps/glad/CMakeLists.txt
vendored
@ -1,2 +1,11 @@
|
|||||||
add_library(glad OBJECT src/glad.c)
|
add_library(glad src/glad.c)
|
||||||
target_include_directories(glad PUBLIC include)
|
|
||||||
|
target_include_directories(glad PUBLIC include)
|
||||||
|
|
||||||
|
install(
|
||||||
|
TARGETS
|
||||||
|
glad
|
||||||
|
DESTINATION
|
||||||
|
LIBRARY DESTINATION lib
|
||||||
|
ARCHIVE DESTINATION lib
|
||||||
|
)
|
||||||
|
12
deps/imgui/CMakeLists.txt
vendored
12
deps/imgui/CMakeLists.txt
vendored
@ -6,7 +6,7 @@ endif()
|
|||||||
# DrinkingTea: end
|
# DrinkingTea: end
|
||||||
|
|
||||||
add_library(
|
add_library(
|
||||||
imgui OBJECT
|
imgui
|
||||||
imgui.cpp
|
imgui.cpp
|
||||||
imgui_demo.cpp
|
imgui_demo.cpp
|
||||||
imgui_draw.cpp
|
imgui_draw.cpp
|
||||||
@ -19,4 +19,12 @@ add_library(
|
|||||||
target_include_directories(
|
target_include_directories(
|
||||||
imgui SYSTEM PUBLIC
|
imgui SYSTEM PUBLIC
|
||||||
.
|
.
|
||||||
)
|
)
|
||||||
|
|
||||||
|
install(
|
||||||
|
TARGETS
|
||||||
|
imgui
|
||||||
|
DESTINATION
|
||||||
|
LIBRARY DESTINATION lib
|
||||||
|
ARCHIVE DESTINATION lib
|
||||||
|
)
|
||||||
|
2
deps/nfde/CMakeLists.txt
vendored
2
deps/nfde/CMakeLists.txt
vendored
@ -1,4 +1,4 @@
|
|||||||
cmake_minimum_required(VERSION 3.5)
|
cmake_minimum_required(VERSION 3.19)
|
||||||
project(nativefiledialog-extended VERSION 1.1.1)
|
project(nativefiledialog-extended VERSION 1.1.1)
|
||||||
|
|
||||||
set(nfd_ROOT_PROJECT OFF)
|
set(nfd_ROOT_PROJECT OFF)
|
||||||
|
2
deps/ox/deps/jsoncpp/CMakeLists.txt
vendored
2
deps/ox/deps/jsoncpp/CMakeLists.txt
vendored
@ -12,7 +12,7 @@
|
|||||||
# CMake versions greater than the JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION policies will
|
# CMake versions greater than the JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION policies will
|
||||||
# continue to generate policy warnings "CMake Warning (dev)...Policy CMP0XXX is not set:"
|
# continue to generate policy warnings "CMake Warning (dev)...Policy CMP0XXX is not set:"
|
||||||
#
|
#
|
||||||
set(JSONCPP_OLDEST_VALIDATED_POLICIES_VERSION "3.8.0")
|
set(JSONCPP_OLDEST_VALIDATED_POLICIES_VERSION "3.13.2")
|
||||||
set(JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION "3.13.2")
|
set(JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION "3.13.2")
|
||||||
cmake_minimum_required(VERSION ${JSONCPP_OLDEST_VALIDATED_POLICIES_VERSION})
|
cmake_minimum_required(VERSION ${JSONCPP_OLDEST_VALIDATED_POLICIES_VERSION})
|
||||||
if("${CMAKE_VERSION}" VERSION_LESS "${JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION}")
|
if("${CMAKE_VERSION}" VERSION_LESS "${JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION}")
|
||||||
|
2
deps/ox/src/ox/clargs/clargs.cpp
vendored
2
deps/ox/src/ox/clargs/clargs.cpp
vendored
@ -29,7 +29,7 @@ ClArgs::ClArgs(ox::SpanView<const char*> args) noexcept {
|
|||||||
m_bools[arg] = false;
|
m_bools[arg] = false;
|
||||||
}
|
}
|
||||||
m_strings[arg] = val;
|
m_strings[arg] = val;
|
||||||
if (auto r = ox::atoi(val.c_str()); r.error == 0) {
|
if (auto r = ox::strToInt(val); r.error == 0) {
|
||||||
m_ints[arg] = r.value;
|
m_ints[arg] = r.value;
|
||||||
}
|
}
|
||||||
++i;
|
++i;
|
||||||
|
2
deps/ox/src/ox/claw/read.cpp
vendored
2
deps/ox/src/ox/claw/read.cpp
vendored
@ -81,7 +81,7 @@ Result<ClawHeader> readClawHeader(ox::BufferView buff) noexcept {
|
|||||||
return ox::Error(4, "Claw format does not match any supported format/version combo");
|
return ox::Error(4, "Claw format does not match any supported format/version combo");
|
||||||
}
|
}
|
||||||
hdr.typeName = typeName;
|
hdr.typeName = typeName;
|
||||||
std::ignore = ox::atoi(versionStr).copyTo(hdr.typeVersion);
|
std::ignore = ox::strToInt(versionStr).copyTo(hdr.typeVersion);
|
||||||
hdr.data = buffRaw;
|
hdr.data = buffRaw;
|
||||||
hdr.dataSize = buffLen;
|
hdr.dataSize = buffLen;
|
||||||
return hdr;
|
return hdr;
|
||||||
|
12
deps/ox/src/ox/event/signal.hpp
vendored
12
deps/ox/src/ox/event/signal.hpp
vendored
@ -143,6 +143,11 @@ class Signal {
|
|||||||
|
|
||||||
Error disconnectObject(const void *receiver) const noexcept;
|
Error disconnectObject(const void *receiver) const noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
size_t connectionCnt() const noexcept {
|
||||||
|
return m_slots.size();
|
||||||
|
}
|
||||||
|
|
||||||
void emit(Args... args) const;
|
void emit(Args... args) const;
|
||||||
|
|
||||||
Error emitCheckError(Args... args) const noexcept;
|
Error emitCheckError(Args... args) const noexcept;
|
||||||
@ -215,7 +220,7 @@ Error Signal<Args...>::emitCheckError(Args... args) const noexcept {
|
|||||||
}
|
}
|
||||||
return ox::Error(0);
|
return ox::Error(0);
|
||||||
} catch (const ox::Exception &ex) {
|
} catch (const ox::Exception &ex) {
|
||||||
return ox::Error(ex.file, ex.line, ex.errCode, ex.msg);
|
return ox::Error(ex.errCode, ex.msg, ex.src);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -319,6 +324,11 @@ class Signal<Error(Args...)> {
|
|||||||
|
|
||||||
Error disconnectObject(const void *receiver) const noexcept;
|
Error disconnectObject(const void *receiver) const noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
size_t connectionCnt() const noexcept {
|
||||||
|
return m_slots.size();
|
||||||
|
}
|
||||||
|
|
||||||
void emit(Args... args) const noexcept;
|
void emit(Args... args) const noexcept;
|
||||||
|
|
||||||
Error emitCheckError(Args... args) const noexcept;
|
Error emitCheckError(Args... args) const noexcept;
|
||||||
|
@ -433,14 +433,14 @@ Error FileStoreTemplate<size_t>::resize() {
|
|||||||
template<typename size_t>
|
template<typename size_t>
|
||||||
Error FileStoreTemplate<size_t>::resize(std::size_t size, void *newBuff) {
|
Error FileStoreTemplate<size_t>::resize(std::size_t size, void *newBuff) {
|
||||||
if (m_buffer->size() > size) {
|
if (m_buffer->size() > size) {
|
||||||
return ox::Error(1);
|
return ox::Error{1, "new buffer is too small for existing data"};
|
||||||
}
|
}
|
||||||
m_buffSize = static_cast<size_t>(size);
|
m_buffSize = static_cast<size_t>(size);
|
||||||
if (newBuff) {
|
if (newBuff) {
|
||||||
m_buffer = reinterpret_cast<Buffer*>(newBuff);
|
m_buffer = static_cast<Buffer*>(newBuff);
|
||||||
OX_RETURN_ERROR(m_buffer->setSize(static_cast<size_t>(size)));
|
OX_RETURN_ERROR(m_buffer->setSize(static_cast<size_t>(size)));
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename size_t>
|
template<typename size_t>
|
||||||
|
@ -31,10 +31,10 @@ FileAddress::FileAddress(uint64_t inode) noexcept {
|
|||||||
FileAddress::FileAddress(ox::StringViewCR path) noexcept {
|
FileAddress::FileAddress(ox::StringViewCR path) noexcept {
|
||||||
auto pathSize = path.bytes();
|
auto pathSize = path.bytes();
|
||||||
m_data.path = new char[pathSize + 1];
|
m_data.path = new char[pathSize + 1];
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
memcpy(m_data.path, path.data(), pathSize);
|
memcpy(m_data.path, path.data(), pathSize);
|
||||||
OX_CLANG_NOWARN_BEGIN(-Wunsafe-buffer-usage)
|
|
||||||
m_data.path[pathSize] = 0;
|
m_data.path[pathSize] = 0;
|
||||||
OX_CLANG_NOWARN_END
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
m_type = FileAddressType::Path;
|
m_type = FileAddressType::Path;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,9 +48,11 @@ FileAddress &FileAddress::operator=(const FileAddress &other) noexcept {
|
|||||||
case FileAddressType::Path:
|
case FileAddressType::Path:
|
||||||
{
|
{
|
||||||
if (other.m_data.path) {
|
if (other.m_data.path) {
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
auto strSize = ox::strlen(other.m_data.path) + 1;
|
auto strSize = ox::strlen(other.m_data.path) + 1;
|
||||||
m_data.path = new char[strSize];
|
m_data.path = new char[strSize];
|
||||||
ox::memcpy(m_data.path, other.m_data.path, strSize);
|
ox::memcpy(m_data.path, other.m_data.path, strSize);
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
} else {
|
} else {
|
||||||
m_data.constPath = "";
|
m_data.constPath = "";
|
||||||
m_type = FileAddressType::ConstPath;
|
m_type = FileAddressType::ConstPath;
|
||||||
|
@ -24,9 +24,6 @@ enum class FileAddressType: int8_t {
|
|||||||
Inode,
|
Inode,
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
constexpr Error model(T *h, CommonPtrWith<class FileAddress> auto *fa) noexcept;
|
|
||||||
|
|
||||||
class FileAddress {
|
class FileAddress {
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
53
deps/ox/src/ox/fs/filesystem/filesystem.cpp
vendored
53
deps/ox/src/ox/fs/filesystem/filesystem.cpp
vendored
@ -37,6 +37,30 @@ Error FileSystem::read(const FileAddress &addr, void *buffer, std::size_t size)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result<Buffer> FileSystem::read(FileAddress const &addr, size_t const size) noexcept {
|
||||||
|
Result<Buffer> out;
|
||||||
|
out.value.resize(size);
|
||||||
|
switch (addr.type()) {
|
||||||
|
case FileAddressType::Inode:
|
||||||
|
OX_RETURN_ERROR(readFileInode(addr.getInode().value, out.value.data(), size));
|
||||||
|
break;
|
||||||
|
case FileAddressType::ConstPath:
|
||||||
|
case FileAddressType::Path:
|
||||||
|
OX_RETURN_ERROR(readFilePath(StringView{addr.getPath().value}, out.value.data(), size));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return ox::Error{1};
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<Buffer> FileSystem::read(StringViewCR path, size_t const size) noexcept {
|
||||||
|
Result<Buffer> out;
|
||||||
|
out.value.resize(size);
|
||||||
|
OX_RETURN_ERROR(readFilePath(path, out.value.data(), size));
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
Result<Buffer> FileSystem::read(const FileAddress &addr) noexcept {
|
Result<Buffer> FileSystem::read(const FileAddress &addr) noexcept {
|
||||||
OX_REQUIRE(s, stat(addr));
|
OX_REQUIRE(s, stat(addr));
|
||||||
Buffer buff(static_cast<std::size_t>(s.size));
|
Buffer buff(static_cast<std::size_t>(s.size));
|
||||||
@ -51,28 +75,31 @@ Result<Buffer> FileSystem::read(StringViewCR path) noexcept {
|
|||||||
return buff;
|
return buff;
|
||||||
}
|
}
|
||||||
|
|
||||||
Error FileSystem::read(const FileAddress &addr, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept {
|
Error FileSystem::read(
|
||||||
|
FileAddress const &addr,
|
||||||
|
std::size_t const readStart,
|
||||||
|
std::size_t const readSize,
|
||||||
|
void *buffer,
|
||||||
|
std::size_t *size) noexcept {
|
||||||
switch (addr.type()) {
|
switch (addr.type()) {
|
||||||
case FileAddressType::Inode:
|
case FileAddressType::Inode:
|
||||||
return read(addr.getInode().value, readStart, readSize, buffer, size);
|
return readFileInodeRange(addr.getInode().value, readStart, readSize, buffer, size);
|
||||||
case FileAddressType::ConstPath:
|
case FileAddressType::ConstPath:
|
||||||
case FileAddressType::Path:
|
case FileAddressType::Path:
|
||||||
return ox::Error(2, "Unsupported for path lookups");
|
return readFilePathRange(addr.getPath().value, readStart, readSize, buffer, size);
|
||||||
default:
|
default:
|
||||||
return ox::Error(1);
|
return ox::Error(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Error FileSystem::remove(const FileAddress &addr, bool recursive) noexcept {
|
Result<size_t> FileSystem::read(
|
||||||
switch (addr.type()) {
|
StringViewCR path,
|
||||||
case FileAddressType::Inode:
|
std::size_t const readStart,
|
||||||
return remove(addr.getInode().value, recursive);
|
std::size_t const readSize,
|
||||||
case FileAddressType::ConstPath:
|
Span<char> buff) noexcept {
|
||||||
case FileAddressType::Path:
|
size_t szOut{buff.size()};
|
||||||
return remove(StringView(addr.getPath().value), recursive);
|
OX_RETURN_ERROR(readFilePathRange(path, readStart, readSize, buff.data(), &szOut));
|
||||||
default:
|
return szOut;
|
||||||
return ox::Error(1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Error FileSystem::write(const FileAddress &addr, const void *buffer, uint64_t size, FileType fileType) noexcept {
|
Error FileSystem::write(const FileAddress &addr, const void *buffer, uint64_t size, FileType fileType) noexcept {
|
||||||
|
113
deps/ox/src/ox/fs/filesystem/filesystem.hpp
vendored
113
deps/ox/src/ox/fs/filesystem/filesystem.hpp
vendored
@ -20,7 +20,7 @@
|
|||||||
namespace ox {
|
namespace ox {
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
static inline void fsBuffFree(char *buff) noexcept {
|
inline void fsBuffFree(char *buff) noexcept {
|
||||||
safeDelete(buff);
|
safeDelete(buff);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -41,25 +41,45 @@ class FileSystem {
|
|||||||
|
|
||||||
Error read(const FileAddress &addr, void *buffer, std::size_t size) noexcept;
|
Error read(const FileAddress &addr, void *buffer, std::size_t size) noexcept;
|
||||||
|
|
||||||
|
Result<Buffer> read(FileAddress const &addr, size_t size) noexcept;
|
||||||
|
|
||||||
|
Result<Buffer> read(StringViewCR path, size_t size) noexcept;
|
||||||
|
|
||||||
Result<Buffer> read(const FileAddress &addr) noexcept;
|
Result<Buffer> read(const FileAddress &addr) noexcept;
|
||||||
|
|
||||||
Result<Buffer> read(StringViewCR path) noexcept;
|
Result<Buffer> read(StringViewCR path) noexcept;
|
||||||
|
|
||||||
inline Error read(StringViewCR path, void *buffer, std::size_t buffSize) noexcept {
|
Error read(StringViewCR path, void *buffer, std::size_t buffSize) noexcept {
|
||||||
return readFilePath(path, buffer, buffSize);
|
return readFilePath(path, buffer, buffSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Error read(uint64_t inode, void *buffer, std::size_t buffSize) noexcept {
|
Error read(uint64_t inode, void *buffer, std::size_t buffSize) noexcept {
|
||||||
return readFileInode(inode, buffer, buffSize);
|
return readFileInode(inode, buffer, buffSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
Error read(const FileAddress &addr, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept;
|
Error read(
|
||||||
|
FileAddress const &addr,
|
||||||
|
size_t readStart,
|
||||||
|
size_t readSize,
|
||||||
|
void *buffer,
|
||||||
|
size_t *size) noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param path
|
||||||
|
* @param readStart
|
||||||
|
* @param readSize
|
||||||
|
* @param buff
|
||||||
|
* @return error or number of bytes read
|
||||||
|
*/
|
||||||
|
Result<size_t> read(
|
||||||
|
StringViewCR path, size_t readStart, size_t readSize, ox::Span<char> buff) noexcept;
|
||||||
|
|
||||||
virtual Result<Vector<String>> ls(StringViewCR dir) const noexcept = 0;
|
virtual Result<Vector<String>> ls(StringViewCR dir) const noexcept = 0;
|
||||||
|
|
||||||
virtual Error remove(StringViewCR path, bool recursive) noexcept = 0;
|
Error remove(StringViewCR path, bool recursive = false) noexcept {
|
||||||
|
return removePath(path, recursive);
|
||||||
Error remove(const FileAddress &addr, bool recursive = false) noexcept;
|
}
|
||||||
|
|
||||||
virtual Error resize(uint64_t size, void *buffer) noexcept = 0;
|
virtual Error resize(uint64_t size, void *buffer) noexcept = 0;
|
||||||
|
|
||||||
@ -81,36 +101,36 @@ class FileSystem {
|
|||||||
|
|
||||||
Error write(const FileAddress &addr, const void *buffer, uint64_t size, FileType fileType = FileType::NormalFile) noexcept;
|
Error write(const FileAddress &addr, const void *buffer, uint64_t size, FileType fileType = FileType::NormalFile) noexcept;
|
||||||
|
|
||||||
inline Error write(StringViewCR path, const void *buffer, uint64_t size, FileType fileType) noexcept {
|
Error write(StringViewCR path, const void *buffer, uint64_t size, FileType fileType) noexcept {
|
||||||
return writeFilePath(path, buffer, size, fileType);
|
return writeFilePath(path, buffer, size, fileType);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Error write(uint64_t inode, const void *buffer, uint64_t size, FileType fileType) noexcept {
|
Error write(uint64_t inode, const void *buffer, uint64_t size, FileType fileType) noexcept {
|
||||||
return writeFileInode(inode, buffer, size, fileType);
|
return writeFileInode(inode, buffer, size, fileType);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Result<FileStat> stat(uint64_t inode) const noexcept {
|
Result<FileStat> stat(uint64_t inode) const noexcept {
|
||||||
return statInode(inode);
|
return statInode(inode);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Result<FileStat> stat(StringViewCR path) const noexcept {
|
Result<FileStat> stat(StringViewCR path) const noexcept {
|
||||||
return statPath(path);
|
return statPath(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<FileStat> stat(const FileAddress &addr) const noexcept;
|
Result<FileStat> stat(const FileAddress &addr) const noexcept;
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
inline bool exists(uint64_t inode) const noexcept {
|
bool exists(uint64_t inode) const noexcept {
|
||||||
return statInode(inode).ok();
|
return statInode(inode).ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
inline bool exists(ox::StringView path) const noexcept {
|
bool exists(ox::StringView path) const noexcept {
|
||||||
return statPath(path).ok();
|
return statPath(path).ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
inline bool exists(FileAddress const&addr) const noexcept {
|
bool exists(FileAddress const&addr) const noexcept {
|
||||||
return stat(addr).ok();
|
return stat(addr).ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -140,7 +160,12 @@ class FileSystem {
|
|||||||
|
|
||||||
virtual Error readFileInode(uint64_t inode, void *buffer, std::size_t size) noexcept = 0;
|
virtual Error readFileInode(uint64_t inode, void *buffer, std::size_t size) noexcept = 0;
|
||||||
|
|
||||||
virtual Error readFileInodeRange(uint64_t inode, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept = 0;
|
virtual Error readFilePathRange(
|
||||||
|
StringViewCR path, size_t readStart, size_t readSize, void *buffer, size_t *buffSize) noexcept = 0;
|
||||||
|
|
||||||
|
virtual Error readFileInodeRange(uint64_t inode, size_t readStart, size_t readSize, void *buffer, size_t *size) noexcept = 0;
|
||||||
|
|
||||||
|
virtual Error removePath(StringViewCR path, bool recursive) noexcept = 0;
|
||||||
|
|
||||||
virtual Error writeFilePath(StringViewCR path, const void *buffer, uint64_t size, FileType fileType) noexcept = 0;
|
virtual Error writeFilePath(StringViewCR path, const void *buffer, uint64_t size, FileType fileType) noexcept = 0;
|
||||||
|
|
||||||
@ -152,11 +177,11 @@ class MemFS: public FileSystem {
|
|||||||
public:
|
public:
|
||||||
Result<const char*> directAccess(const FileAddress &addr) const noexcept;
|
Result<const char*> directAccess(const FileAddress &addr) const noexcept;
|
||||||
|
|
||||||
inline Result<const char*> directAccess(StringViewCR path) const noexcept {
|
Result<const char*> directAccess(StringViewCR path) const noexcept {
|
||||||
return directAccessPath(path);
|
return directAccessPath(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Result<const char*> directAccess(uint64_t inode) const noexcept {
|
Result<const char*> directAccess(uint64_t inode) const noexcept {
|
||||||
return directAccessInode(inode);
|
return directAccessInode(inode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,6 +234,11 @@ class FileSystemTemplate: public MemFS {
|
|||||||
|
|
||||||
Error readFileInodeRange(uint64_t inode, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept override;
|
Error readFileInodeRange(uint64_t inode, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept override;
|
||||||
|
|
||||||
|
Error readFilePathRange(
|
||||||
|
StringViewCR path, size_t readStart, size_t readSize, void *buffer, size_t *buffSize) noexcept override;
|
||||||
|
|
||||||
|
Error removePath(StringViewCR path, bool recursive) noexcept override;
|
||||||
|
|
||||||
Result<const char*> directAccessInode(uint64_t) const noexcept override;
|
Result<const char*> directAccessInode(uint64_t) const noexcept override;
|
||||||
|
|
||||||
Result<Vector<String>> ls(StringViewCR dir) const noexcept override;
|
Result<Vector<String>> ls(StringViewCR dir) const noexcept override;
|
||||||
@ -216,8 +246,6 @@ class FileSystemTemplate: public MemFS {
|
|||||||
template<typename F>
|
template<typename F>
|
||||||
Error ls(StringViewCR path, F cb) const;
|
Error ls(StringViewCR path, F cb) const;
|
||||||
|
|
||||||
Error remove(StringViewCR path, bool recursive) noexcept override;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resizes FileSystem to minimum possible size.
|
* Resizes FileSystem to minimum possible size.
|
||||||
*/
|
*/
|
||||||
@ -356,6 +384,32 @@ Error FileSystemTemplate<FileStore, Directory>::readFileInodeRange(uint64_t inod
|
|||||||
return m_fs.read(inode, readStart, readSize, reinterpret_cast<uint8_t*>(buffer), size);
|
return m_fs.read(inode, readStart, readSize, reinterpret_cast<uint8_t*>(buffer), size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename FileStore, typename Directory>
|
||||||
|
Error FileSystemTemplate<FileStore, Directory>::readFilePathRange(
|
||||||
|
StringViewCR path, size_t readStart, size_t readSize, void *buffer, size_t *buffSize) noexcept {
|
||||||
|
OX_REQUIRE(s, stat(path));
|
||||||
|
return readFileInodeRange(s.inode, readStart, readSize, buffer, buffSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename FileStore, typename Directory>
|
||||||
|
Error FileSystemTemplate<FileStore, Directory>::removePath(StringViewCR path, bool recursive) noexcept {
|
||||||
|
OX_REQUIRE(fd, fileSystemData());
|
||||||
|
Directory rootDir(m_fs, fd.rootDirInode);
|
||||||
|
OX_REQUIRE(inode, rootDir.find(path));
|
||||||
|
OX_REQUIRE(st, statInode(inode));
|
||||||
|
if (st.fileType == FileType::NormalFile || recursive) {
|
||||||
|
if (auto err = rootDir.remove(path)) {
|
||||||
|
// removal failed, try putting the index back
|
||||||
|
oxLogError(rootDir.write(path, inode));
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
oxTrace("FileSystemTemplate.remove.fail", "Tried to remove directory without recursive setting.");
|
||||||
|
return ox::Error(1);
|
||||||
|
}
|
||||||
|
return ox::Error(0);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename FileStore, typename Directory>
|
template<typename FileStore, typename Directory>
|
||||||
Result<const char*> FileSystemTemplate<FileStore, Directory>::directAccessInode(uint64_t inode) const noexcept {
|
Result<const char*> FileSystemTemplate<FileStore, Directory>::directAccessInode(uint64_t inode) const noexcept {
|
||||||
auto data = m_fs.read(inode);
|
auto data = m_fs.read(inode);
|
||||||
@ -384,25 +438,6 @@ Error FileSystemTemplate<FileStore, Directory>::ls(StringViewCR path, F cb) cons
|
|||||||
return dir.ls(cb);
|
return dir.ls(cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename FileStore, typename Directory>
|
|
||||||
Error FileSystemTemplate<FileStore, Directory>::remove(StringViewCR path, bool recursive) noexcept {
|
|
||||||
OX_REQUIRE(fd, fileSystemData());
|
|
||||||
Directory rootDir(m_fs, fd.rootDirInode);
|
|
||||||
OX_REQUIRE(inode, rootDir.find(path));
|
|
||||||
OX_REQUIRE(st, statInode(inode));
|
|
||||||
if (st.fileType == FileType::NormalFile || recursive) {
|
|
||||||
if (auto err = rootDir.remove(path)) {
|
|
||||||
// removal failed, try putting the index back
|
|
||||||
oxLogError(rootDir.write(path, inode));
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
oxTrace("FileSystemTemplate.remove.fail", "Tried to remove directory without recursive setting.");
|
|
||||||
return ox::Error(1);
|
|
||||||
}
|
|
||||||
return ox::Error(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename FileStore, typename Directory>
|
template<typename FileStore, typename Directory>
|
||||||
Error FileSystemTemplate<FileStore, Directory>::resize() noexcept {
|
Error FileSystemTemplate<FileStore, Directory>::resize() noexcept {
|
||||||
return m_fs.resize();
|
return m_fs.resize();
|
||||||
@ -433,7 +468,7 @@ Error FileSystemTemplate<FileStore, Directory>::writeFilePath(
|
|||||||
|
|
||||||
template<typename FileStore, typename Directory>
|
template<typename FileStore, typename Directory>
|
||||||
Error FileSystemTemplate<FileStore, Directory>::writeFileInode(uint64_t inode, const void *buffer, uint64_t size, FileType fileType) noexcept {
|
Error FileSystemTemplate<FileStore, Directory>::writeFileInode(uint64_t inode, const void *buffer, uint64_t size, FileType fileType) noexcept {
|
||||||
oxTrace("ox.fs.FileSystemTemplate.writeFileInode", ox::itoa(inode));
|
oxTrace("ox.fs.FileSystemTemplate.writeFileInode", ox::intToStr(inode));
|
||||||
return m_fs.write(inode, buffer, static_cast<size_t>(size), static_cast<uint8_t>(fileType));
|
return m_fs.write(inode, buffer, static_cast<size_t>(size), static_cast<uint8_t>(fileType));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
42
deps/ox/src/ox/fs/filesystem/passthroughfs.cpp
vendored
42
deps/ox/src/ox/fs/filesystem/passthroughfs.cpp
vendored
@ -75,14 +75,6 @@ Result<Vector<String>> PassThroughFS::ls(StringViewCR dir) const noexcept {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
Error PassThroughFS::remove(StringViewCR path, bool recursive) noexcept {
|
|
||||||
if (recursive) {
|
|
||||||
return ox::Error(std::filesystem::remove_all(m_path / stripSlash(path)) != 0);
|
|
||||||
} else {
|
|
||||||
return ox::Error(std::filesystem::remove(m_path / stripSlash(path)) != 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Error PassThroughFS::resize(uint64_t, void*) noexcept {
|
Error PassThroughFS::resize(uint64_t, void*) noexcept {
|
||||||
// unsupported
|
// unsupported
|
||||||
return ox::Error(1, "resize is not supported by PassThroughFS");
|
return ox::Error(1, "resize is not supported by PassThroughFS");
|
||||||
@ -101,7 +93,9 @@ Result<FileStat> PassThroughFS::statPath(StringViewCR path) const noexcept {
|
|||||||
oxTracef("ox.fs.PassThroughFS.statInode", "{} {}", ec.message(), path);
|
oxTracef("ox.fs.PassThroughFS.statInode", "{} {}", ec.message(), path);
|
||||||
const uint64_t size = type == FileType::Directory ? 0 : std::filesystem::file_size(p, ec);
|
const uint64_t size = type == FileType::Directory ? 0 : std::filesystem::file_size(p, ec);
|
||||||
oxTracef("ox.fs.PassThroughFS.statInode.size", "{} {}", path, size);
|
oxTracef("ox.fs.PassThroughFS.statInode.size", "{} {}", path, size);
|
||||||
OX_RETURN_ERROR(ox::Error(static_cast<ox::ErrorCode>(ec.value()), "PassThroughFS: stat failed"));
|
if (auto err = ec.value()) {
|
||||||
|
return ox::Error{static_cast<ox::ErrorCode>(err), "PassThroughFS: stat failed"};
|
||||||
|
}
|
||||||
return FileStat{0, 0, size, type};
|
return FileStat{0, 0, size, type};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,11 +156,38 @@ Error PassThroughFS::readFileInode(uint64_t, void*, std::size_t) noexcept {
|
|||||||
return ox::Error(1, "readFileInode(uint64_t, void*, std::size_t) is not supported by PassThroughFS");
|
return ox::Error(1, "readFileInode(uint64_t, void*, std::size_t) is not supported by PassThroughFS");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Error PassThroughFS::readFilePathRange(
|
||||||
|
StringViewCR path, size_t const readStart, size_t readSize, void *buffer, size_t *buffSize) noexcept {
|
||||||
|
try {
|
||||||
|
std::ifstream file(m_path / stripSlash(path), std::ios::binary | std::ios::ate);
|
||||||
|
auto const size = static_cast<size_t>(file.tellg());
|
||||||
|
readSize = ox::min(readSize, size);
|
||||||
|
file.seekg(static_cast<off_t>(readStart), std::ios::beg);
|
||||||
|
if (readSize > *buffSize) {
|
||||||
|
oxTracef("ox.fs.PassThroughFS.read.error", "Read failed: Buffer too small: {}", path);
|
||||||
|
return ox::Error{1};
|
||||||
|
}
|
||||||
|
file.read(static_cast<char*>(buffer), static_cast<std::streamsize>(readSize));
|
||||||
|
return {};
|
||||||
|
} catch (std::fstream::failure const &f) {
|
||||||
|
oxTracef("ox.fs.PassThroughFS.read.error", "Read of {} failed: {}", path, f.what());
|
||||||
|
return ox::Error{2};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Error PassThroughFS::readFileInodeRange(uint64_t, std::size_t, std::size_t, void*, std::size_t*) noexcept {
|
Error PassThroughFS::readFileInodeRange(uint64_t, std::size_t, std::size_t, void*, std::size_t*) noexcept {
|
||||||
// unsupported
|
// unsupported
|
||||||
return ox::Error(1, "read(uint64_t, std::size_t, std::size_t, void*, std::size_t*) is not supported by PassThroughFS");
|
return ox::Error(1, "read(uint64_t, std::size_t, std::size_t, void*, std::size_t*) is not supported by PassThroughFS");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Error PassThroughFS::removePath(StringViewCR path, bool const recursive) noexcept {
|
||||||
|
if (recursive) {
|
||||||
|
return ox::Error{std::filesystem::remove_all(m_path / stripSlash(path)) == 0};
|
||||||
|
} else {
|
||||||
|
return ox::Error{!std::filesystem::remove(m_path / stripSlash(path))};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Error PassThroughFS::writeFilePath(StringViewCR path, const void *buffer, uint64_t size, FileType) noexcept {
|
Error PassThroughFS::writeFilePath(StringViewCR path, const void *buffer, uint64_t size, FileType) noexcept {
|
||||||
const auto p = (m_path / stripSlash(path));
|
const auto p = (m_path / stripSlash(path));
|
||||||
try {
|
try {
|
||||||
@ -185,8 +206,7 @@ Error PassThroughFS::writeFileInode(uint64_t, const void*, uint64_t, FileType) n
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string_view PassThroughFS::stripSlash(StringView path) noexcept {
|
std::string_view PassThroughFS::stripSlash(StringView path) noexcept {
|
||||||
const auto pathLen = ox::strlen(path);
|
for (auto i = 0u; i < path.len() && path[0] == '/'; i++) {
|
||||||
for (auto i = 0u; i < pathLen && path[0] == '/'; i++) {
|
|
||||||
path = substr(path, 1);
|
path = substr(path, 1);
|
||||||
}
|
}
|
||||||
return {path.data(), path.bytes()};
|
return {path.data(), path.bytes()};
|
||||||
|
@ -45,8 +45,6 @@ class PassThroughFS: public FileSystem {
|
|||||||
template<typename F>
|
template<typename F>
|
||||||
Error ls(StringViewCR dir, F cb) const noexcept;
|
Error ls(StringViewCR dir, F cb) const noexcept;
|
||||||
|
|
||||||
Error remove(StringViewCR path, bool recursive) noexcept override;
|
|
||||||
|
|
||||||
Error resize(uint64_t size, void *buffer) noexcept override;
|
Error resize(uint64_t size, void *buffer) noexcept override;
|
||||||
|
|
||||||
Result<FileStat> statInode(uint64_t inode) const noexcept override;
|
Result<FileStat> statInode(uint64_t inode) const noexcept override;
|
||||||
@ -73,8 +71,13 @@ class PassThroughFS: public FileSystem {
|
|||||||
|
|
||||||
Error readFileInode(uint64_t inode, void *buffer, std::size_t size) noexcept override;
|
Error readFileInode(uint64_t inode, void *buffer, std::size_t size) noexcept override;
|
||||||
|
|
||||||
|
Error readFilePathRange(
|
||||||
|
StringViewCR path, size_t readStart, size_t readSize, void *buffer, size_t *buffSize) noexcept override;
|
||||||
|
|
||||||
Error readFileInodeRange(uint64_t inode, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept override;
|
Error readFileInodeRange(uint64_t inode, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept override;
|
||||||
|
|
||||||
|
Error removePath(StringViewCR path, bool recursive) noexcept override;
|
||||||
|
|
||||||
Error writeFilePath(StringViewCR path, const void *buffer, uint64_t size, FileType fileType) noexcept override;
|
Error writeFilePath(StringViewCR path, const void *buffer, uint64_t size, FileType fileType) noexcept override;
|
||||||
|
|
||||||
Error writeFileInode(uint64_t inode, const void *buffer, uint64_t size, FileType fileType) noexcept override;
|
Error writeFileInode(uint64_t inode, const void *buffer, uint64_t size, FileType fileType) noexcept override;
|
||||||
|
6
deps/ox/src/ox/fs/test/tests.cpp
vendored
6
deps/ox/src/ox/fs/test/tests.cpp
vendored
@ -119,7 +119,9 @@ const std::map<ox::StringView, std::function<ox::Error(ox::StringView)>> tests =
|
|||||||
auto constexpr path = ox::StringLiteral("/usr/share/charset.gbag");
|
auto constexpr path = ox::StringLiteral("/usr/share/charset.gbag");
|
||||||
ox::PathIterator it(path.c_str(), path.len());
|
ox::PathIterator it(path.c_str(), path.len());
|
||||||
auto buff = static_cast<char*>(ox_alloca(path.len() + 1));
|
auto buff = static_cast<char*>(ox_alloca(path.len() + 1));
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
oxAssert(it.dirPath(buff, path.len()) == 0 && ox::strcmp(buff, "/usr/share/") == 0, "PathIterator shows incorrect dir path");
|
oxAssert(it.dirPath(buff, path.len()) == 0 && ox::strcmp(buff, "/usr/share/") == 0, "PathIterator shows incorrect dir path");
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
return ox::Error(0);
|
return ox::Error(0);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -127,7 +129,9 @@ const std::map<ox::StringView, std::function<ox::Error(ox::StringView)>> tests =
|
|||||||
"PathIterator::hasNext",
|
"PathIterator::hasNext",
|
||||||
[](ox::StringView) {
|
[](ox::StringView) {
|
||||||
const auto path = "/file1";
|
const auto path = "/file1";
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
ox::PathIterator it(path, ox::strlen(path));
|
ox::PathIterator it(path, ox::strlen(path));
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
oxAssert(it.hasNext(), "PathIterator shows incorrect hasNext");
|
oxAssert(it.hasNext(), "PathIterator shows incorrect hasNext");
|
||||||
oxAssert(!it.next().hasNext(), "PathIterator shows incorrect hasNext");
|
oxAssert(!it.next().hasNext(), "PathIterator shows incorrect hasNext");
|
||||||
return ox::Error(0);
|
return ox::Error(0);
|
||||||
@ -163,9 +167,11 @@ const std::map<ox::StringView, std::function<ox::Error(ox::StringView)>> tests =
|
|||||||
[](ox::StringView) {
|
[](ox::StringView) {
|
||||||
constexpr auto buffLen = 5000;
|
constexpr auto buffLen = 5000;
|
||||||
constexpr auto str1 = "Hello, World!";
|
constexpr auto str1 = "Hello, World!";
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
constexpr auto str1Len = ox::strlen(str1) + 1;
|
constexpr auto str1Len = ox::strlen(str1) + 1;
|
||||||
constexpr auto str2 = "Hello, Moon!";
|
constexpr auto str2 = "Hello, Moon!";
|
||||||
constexpr auto str2Len = ox::strlen(str2) + 1;
|
constexpr auto str2Len = ox::strlen(str2) + 1;
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
auto list = new (ox_alloca(buffLen)) ox::ptrarith::NodeBuffer<uint32_t, ox::FileStoreItem<uint32_t>>(buffLen);
|
auto list = new (ox_alloca(buffLen)) ox::ptrarith::NodeBuffer<uint32_t, ox::FileStoreItem<uint32_t>>(buffLen);
|
||||||
oxAssert(ox::FileStore32::format(list, buffLen), "FileStore::format failed.");
|
oxAssert(ox::FileStore32::format(list, buffLen), "FileStore::format failed.");
|
||||||
ox::FileStore32 fileStore(list, buffLen);
|
ox::FileStore32 fileStore(list, buffLen);
|
||||||
|
2
deps/ox/src/ox/fs/tool.cpp
vendored
2
deps/ox/src/ox/fs/tool.cpp
vendored
@ -57,7 +57,9 @@ static ox::Error runRead(ox::FileSystem *fs, ox::Span<const char*> args) noexcep
|
|||||||
return ox::Error(1);
|
return ox::Error(1);
|
||||||
}
|
}
|
||||||
OX_REQUIRE(buff, fs->read(ox::StringView(args[1])));
|
OX_REQUIRE(buff, fs->read(ox::StringView(args[1])));
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
std::ignore = fwrite(buff.data(), sizeof(decltype(buff)::value_type), buff.size(), stdout);
|
std::ignore = fwrite(buff.data(), sizeof(decltype(buff)::value_type), buff.size(), stdout);
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
return ox::Error(0);
|
return ox::Error(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
deps/ox/src/ox/logconn/def.hpp
vendored
2
deps/ox/src/ox/logconn/def.hpp
vendored
@ -14,7 +14,7 @@
|
|||||||
{ \
|
{ \
|
||||||
const auto loggerErr = (loggerName).initConn(appName); \
|
const auto loggerErr = (loggerName).initConn(appName); \
|
||||||
if (loggerErr) { \
|
if (loggerErr) { \
|
||||||
oxErrf("Could not connect to logger: {} ({}:{})\n", toStr(loggerErr), loggerErr.file, loggerErr.line); \
|
oxErrf("Could not connect to logger: {} ({}:{})\n", toStr(loggerErr), loggerErr.src.file_name(), loggerErr.src.line()); \
|
||||||
} else { \
|
} else { \
|
||||||
ox::trace::setLogger(&(loggerName)); \
|
ox::trace::setLogger(&(loggerName)); \
|
||||||
} \
|
} \
|
||||||
|
64
deps/ox/src/ox/mc/intops.hpp
vendored
64
deps/ox/src/ox/mc/intops.hpp
vendored
@ -71,7 +71,9 @@ constexpr McInt encodeInteger(I pInput) noexcept {
|
|||||||
// move input to uint64_t to allow consistent bit manipulation, and to avoid
|
// move input to uint64_t to allow consistent bit manipulation, and to avoid
|
||||||
// overflow concerns
|
// overflow concerns
|
||||||
uint64_t val = 0;
|
uint64_t val = 0;
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
ox::memcpy(&val, &input, sizeof(input));
|
ox::memcpy(&val, &input, sizeof(input));
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
if (val) {
|
if (val) {
|
||||||
// bits needed to represent number factoring in space possibly
|
// bits needed to represent number factoring in space possibly
|
||||||
// needed for signed bit
|
// needed for signed bit
|
||||||
@ -94,7 +96,9 @@ constexpr McInt encodeInteger(I pInput) noexcept {
|
|||||||
}
|
}
|
||||||
if (bytes == 9) {
|
if (bytes == 9) {
|
||||||
out.data[0] = bytesIndicator;
|
out.data[0] = bytesIndicator;
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
ox::memcpy(&out.data[1], &leVal, 8);
|
ox::memcpy(&out.data[1], &leVal, 8);
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
if (inputNegative) {
|
if (inputNegative) {
|
||||||
out.data[1] |= 0b1000'0000;
|
out.data[1] |= 0b1000'0000;
|
||||||
}
|
}
|
||||||
@ -104,7 +108,9 @@ constexpr McInt encodeInteger(I pInput) noexcept {
|
|||||||
auto intermediate =
|
auto intermediate =
|
||||||
static_cast<uint64_t>(leVal.raw() | (negBit << (valBits - 1))) << bytes |
|
static_cast<uint64_t>(leVal.raw() | (negBit << (valBits - 1))) << bytes |
|
||||||
static_cast<uint64_t>(bytesIndicator);
|
static_cast<uint64_t>(bytesIndicator);
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
ox::memcpy(&out.data[0], &intermediate, sizeof(intermediate));
|
ox::memcpy(&out.data[0], &intermediate, sizeof(intermediate));
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
}
|
}
|
||||||
out.length = bytes;
|
out.length = bytes;
|
||||||
}
|
}
|
||||||
@ -151,33 +157,37 @@ constexpr Result<I> decodeInteger(Reader_c auto&rdr, std::size_t *bytesRead) noe
|
|||||||
decoded >>= bytes;
|
decoded >>= bytes;
|
||||||
// move sign bit
|
// move sign bit
|
||||||
if constexpr(is_signed_v<I>) {
|
if constexpr(is_signed_v<I>) {
|
||||||
const auto negBit = bytes * 8 - bytes - 1;
|
const auto negBit = bytes * 8 - bytes - 1;
|
||||||
// move sign
|
// move sign
|
||||||
const auto negative = (decoded >> negBit) == 1;
|
const auto negative = (decoded >> negBit) == 1;
|
||||||
if (negative) {
|
if (negative) {
|
||||||
// fill in all bits between encoded sign and real sign with 1s
|
// fill in all bits between encoded sign and real sign with 1s
|
||||||
// split it up because the 32-bit ARM can't shift more than 32 bits
|
// split it up because the 32-bit ARM can't shift more than 32 bits
|
||||||
ox::Array<uint32_t, 2> d = {};
|
ox::Array<uint32_t, 2> d = {};
|
||||||
//d[0] = decoded & 0xffff'ffff;
|
//d[0] = decoded & 0xffff'ffff;
|
||||||
//d[1] = decoded >> 32;
|
//d[1] = decoded >> 32;
|
||||||
ox::memcpy(&d[0], &decoded, sizeof(decoded));
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
auto bit = negBit;
|
ox::memcpy(&d[0], &decoded, sizeof(decoded));
|
||||||
for (; bit < ox::min<std::size_t>(Bits<I>, 32); ++bit) {
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
d[0] |= 1 << bit;
|
auto bit = negBit;
|
||||||
}
|
for (; bit < ox::min<std::size_t>(Bits<I>, 32); ++bit) {
|
||||||
bit -= 32;
|
d[0] |= 1 << bit;
|
||||||
for (; bit < Bits<I>; ++bit) {
|
}
|
||||||
d[1] |= 1 << bit;
|
bit -= 32;
|
||||||
}
|
for (; bit < Bits<I>; ++bit) {
|
||||||
I out = 0;
|
d[1] |= 1 << bit;
|
||||||
if constexpr(ox::defines::BigEndian) {
|
}
|
||||||
const auto d0Tmp = d[0];
|
I out = 0;
|
||||||
d[0] = d[1];
|
if constexpr(ox::defines::BigEndian) {
|
||||||
d[1] = d0Tmp;
|
const auto d0Tmp = d[0];
|
||||||
}
|
d[0] = d[1];
|
||||||
ox::memcpy(&out, &d[0], sizeof(out));
|
d[1] = d0Tmp;
|
||||||
return out;
|
}
|
||||||
}
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
|
ox::memcpy(&out, &d[0], sizeof(out));
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
|
return out;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return static_cast<I>(decoded);
|
return static_cast<I>(decoded);
|
||||||
}
|
}
|
||||||
|
5
deps/ox/src/ox/mc/write.hpp
vendored
5
deps/ox/src/ox/mc/write.hpp
vendored
@ -214,7 +214,12 @@ template<Writer_c Writer>
|
|||||||
constexpr Error MetalClawWriter<Writer>::fieldCString(const char*, const char *const*val, std::size_t) noexcept {
|
constexpr Error MetalClawWriter<Writer>::fieldCString(const char*, const char *const*val, std::size_t) noexcept {
|
||||||
bool fieldSet = false;
|
bool fieldSet = false;
|
||||||
if (!m_unionIdx.has_value() || *m_unionIdx == m_field) {
|
if (!m_unionIdx.has_value() || *m_unionIdx == m_field) {
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
|
// this strlen is tolerated because sometimes 0 gets passed to
|
||||||
|
// the size param, which is a lie
|
||||||
|
// this code should be cleaned up at some point...
|
||||||
const auto strLen = *val ? ox::strlen(*val) : 0;
|
const auto strLen = *val ? ox::strlen(*val) : 0;
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
// write the length
|
// write the length
|
||||||
const auto strLenBuff = mc::encodeInteger(strLen);
|
const auto strLenBuff = mc::encodeInteger(strLen);
|
||||||
OX_RETURN_ERROR(m_writer.write(reinterpret_cast<const char*>(strLenBuff.data.data()), strLenBuff.length));
|
OX_RETURN_ERROR(m_writer.write(reinterpret_cast<const char*>(strLenBuff.data.data()), strLenBuff.length));
|
||||||
|
12
deps/ox/src/ox/model/modelvalue.hpp
vendored
12
deps/ox/src/ox/model/modelvalue.hpp
vendored
@ -997,7 +997,7 @@ constexpr ModelValue::ModelValue(const ModelValue &other) noexcept {
|
|||||||
case Type::SignedInteger16:
|
case Type::SignedInteger16:
|
||||||
case Type::SignedInteger32:
|
case Type::SignedInteger32:
|
||||||
case Type::SignedInteger64:
|
case Type::SignedInteger64:
|
||||||
ox::memcpy(&m_data, &other.m_data, sizeof(m_data));
|
m_data = other.m_data;
|
||||||
break;
|
break;
|
||||||
case Type::String:
|
case Type::String:
|
||||||
m_data.str = new String(other.get<String>());
|
m_data.str = new String(other.get<String>());
|
||||||
@ -1030,8 +1030,8 @@ constexpr ModelValue::ModelValue(ModelValue &&other) noexcept {
|
|||||||
case Type::SignedInteger16:
|
case Type::SignedInteger16:
|
||||||
case Type::SignedInteger32:
|
case Type::SignedInteger32:
|
||||||
case Type::SignedInteger64:
|
case Type::SignedInteger64:
|
||||||
ox::memcpy(&m_data, &other.m_data, sizeof(m_data));
|
m_data = other.m_data;
|
||||||
ox::memset(&other.m_data, 0, sizeof(m_data));
|
other.m_data.ui64 = 0;
|
||||||
break;
|
break;
|
||||||
case Type::String:
|
case Type::String:
|
||||||
m_data.str = other.m_data.str;
|
m_data.str = other.m_data.str;
|
||||||
@ -1223,7 +1223,7 @@ constexpr ModelValue &ModelValue::operator=(const ModelValue &other) noexcept {
|
|||||||
case Type::SignedInteger16:
|
case Type::SignedInteger16:
|
||||||
case Type::SignedInteger32:
|
case Type::SignedInteger32:
|
||||||
case Type::SignedInteger64:
|
case Type::SignedInteger64:
|
||||||
ox::memcpy(&m_data, &other.m_data, sizeof(m_data));
|
m_data = other.m_data;
|
||||||
break;
|
break;
|
||||||
case Type::String:
|
case Type::String:
|
||||||
m_data.str = new String(other.get<String>());
|
m_data.str = new String(other.get<String>());
|
||||||
@ -1261,8 +1261,8 @@ constexpr ModelValue &ModelValue::operator=(ModelValue &&other) noexcept {
|
|||||||
case Type::SignedInteger16:
|
case Type::SignedInteger16:
|
||||||
case Type::SignedInteger32:
|
case Type::SignedInteger32:
|
||||||
case Type::SignedInteger64:
|
case Type::SignedInteger64:
|
||||||
ox::memcpy(&m_data, &other.m_data, sizeof(m_data));
|
m_data = other.m_data;
|
||||||
ox::memset(&other.m_data, 0, sizeof(m_data));
|
other.m_data = {};
|
||||||
break;
|
break;
|
||||||
case Type::String:
|
case Type::String:
|
||||||
m_data.str = other.m_data.str;
|
m_data.str = other.m_data.str;
|
||||||
|
6
deps/ox/src/ox/model/typenamecatcher.hpp
vendored
6
deps/ox/src/ox/model/typenamecatcher.hpp
vendored
@ -140,16 +140,16 @@ constexpr Str getModelTypeName() noexcept {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T, typename Str = const char*>
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
consteval auto requireModelTypeName() noexcept {
|
consteval auto requireModelTypeName() noexcept {
|
||||||
constexpr auto name = getModelTypeName<T>();
|
constexpr auto name = getModelTypeName<T, Str>();
|
||||||
static_assert(ox::StringView{name}.len(), "Type lacks required TypeName");
|
static_assert(ox::StringView{name}.len(), "Type lacks required TypeName");
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, typename Str = const char*>
|
template<typename T, typename Str = const char*>
|
||||||
constexpr auto ModelTypeName_v = getModelTypeName<T, Str>();
|
constexpr auto ModelTypeName_v = requireModelTypeName<T, Str>();
|
||||||
|
|
||||||
template<typename T, typename Str = const char*>
|
template<typename T, typename Str = const char*>
|
||||||
constexpr auto ModelTypeVersion_v = requireModelTypeVersion<T>();
|
constexpr auto ModelTypeVersion_v = requireModelTypeVersion<T>();
|
||||||
|
6
deps/ox/src/ox/model/typestore.hpp
vendored
6
deps/ox/src/ox/model/typestore.hpp
vendored
@ -58,7 +58,11 @@ class TypeStore {
|
|||||||
if (!std::is_constant_evaluated()) {
|
if (!std::is_constant_evaluated()) {
|
||||||
OX_REQUIRE_M(dt, loadDescriptor(typeId));
|
OX_REQUIRE_M(dt, loadDescriptor(typeId));
|
||||||
for (auto &f : dt->fieldList) {
|
for (auto &f : dt->fieldList) {
|
||||||
OX_RETURN_ERROR(this->getLoad(f.typeId).moveTo(f.type));
|
if (typeId == f.typeId) {
|
||||||
|
f.type = dt.get();
|
||||||
|
} else {
|
||||||
|
OX_RETURN_ERROR(this->getLoad(f.typeId).moveTo(f.type));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
auto &out = m_cache[typeId];
|
auto &out = m_cache[typeId];
|
||||||
out = std::move(dt);
|
out = std::move(dt);
|
||||||
|
2
deps/ox/src/ox/oc/read.cpp
vendored
2
deps/ox/src/ox/oc/read.cpp
vendored
@ -15,7 +15,7 @@ namespace ox {
|
|||||||
|
|
||||||
OrganicClawReader::OrganicClawReader(const uint8_t *buff, std::size_t buffSize) {
|
OrganicClawReader::OrganicClawReader(const uint8_t *buff, std::size_t buffSize) {
|
||||||
auto json = reinterpret_cast<const char*>(buff);
|
auto json = reinterpret_cast<const char*>(buff);
|
||||||
auto jsonLen = ox::strnlen(json, buffSize);
|
auto jsonLen = ox::strnlen_s(json, buffSize);
|
||||||
Json::CharReaderBuilder parserBuilder;
|
Json::CharReaderBuilder parserBuilder;
|
||||||
auto parser = std::unique_ptr<Json::CharReader>(parserBuilder.newCharReader());
|
auto parser = std::unique_ptr<Json::CharReader>(parserBuilder.newCharReader());
|
||||||
if (!parser->parse(json, json + jsonLen, &m_json, nullptr)) {
|
if (!parser->parse(json, json + jsonLen, &m_json, nullptr)) {
|
||||||
|
13
deps/ox/src/ox/oc/read.hpp
vendored
13
deps/ox/src/ox/oc/read.hpp
vendored
@ -8,7 +8,11 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <ox/std/def.hpp>
|
||||||
|
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
|
|
||||||
#include <ox/model/fieldcounter.hpp>
|
#include <ox/model/fieldcounter.hpp>
|
||||||
#include <ox/model/modelhandleradaptor.hpp>
|
#include <ox/model/modelhandleradaptor.hpp>
|
||||||
@ -144,7 +148,11 @@ Error OrganicClawReader::field(const char *key, T *val) noexcept {
|
|||||||
if (jv.empty()) {
|
if (jv.empty()) {
|
||||||
*val = 0;
|
*val = 0;
|
||||||
} else if (rightType) {
|
} else if (rightType) {
|
||||||
*val = static_cast<T>(jv.asUInt());
|
if constexpr(ox::is_signed_v<T>) {
|
||||||
|
*val = static_cast<T>(jv.asInt64());
|
||||||
|
} else {
|
||||||
|
*val = static_cast<T>(jv.asUInt64());
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
err = ox::Error(1, "Type mismatch");
|
err = ox::Error(1, "Type mismatch");
|
||||||
}
|
}
|
||||||
@ -172,7 +180,8 @@ Error OrganicClawReader::field(const char *key, T *val) noexcept {
|
|||||||
err = ox::Error(1, "Type mismatch");
|
err = ox::Error(1, "Type mismatch");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Json::LogicError const&) {
|
} catch (Json::LogicError const&e) {
|
||||||
|
oxDebugf("JSON error: {}", e.what());
|
||||||
err = ox::Error(1, "error reading JSON data");
|
err = ox::Error(1, "error reading JSON data");
|
||||||
}
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
|
8
deps/ox/src/ox/oc/write.hpp
vendored
8
deps/ox/src/ox/oc/write.hpp
vendored
@ -8,7 +8,11 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <ox/std/def.hpp>
|
||||||
|
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
|
|
||||||
#include <ox/model/fieldcounter.hpp>
|
#include <ox/model/fieldcounter.hpp>
|
||||||
#include <ox/model/modelhandleradaptor.hpp>
|
#include <ox/model/modelhandleradaptor.hpp>
|
||||||
@ -258,7 +262,9 @@ Result<ox::Buffer> writeOC(const auto &val) noexcept {
|
|||||||
const auto str = Json::writeString(jsonBuilder, writer.m_json);
|
const auto str = Json::writeString(jsonBuilder, writer.m_json);
|
||||||
Result<Buffer> buff;
|
Result<Buffer> buff;
|
||||||
buff.value.resize(str.size() + 1);
|
buff.value.resize(str.size() + 1);
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
memcpy(buff.value.data(), str.data(), str.size() + 1);
|
memcpy(buff.value.data(), str.data(), str.size() + 1);
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
return buff;
|
return buff;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,7 +276,9 @@ Result<ox::String> writeOCString(const auto &val) noexcept {
|
|||||||
const auto str = Json::writeString(jsonBuilder, writer.m_json);
|
const auto str = Json::writeString(jsonBuilder, writer.m_json);
|
||||||
Result<ox::String> buff;
|
Result<ox::String> buff;
|
||||||
buff.value.resize(str.size());
|
buff.value.resize(str.size());
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
memcpy(buff.value.data(), str.data(), str.size() + 1);
|
memcpy(buff.value.data(), str.data(), str.size() + 1);
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
return buff;
|
return buff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
14
deps/ox/src/ox/std/algorithm.hpp
vendored
14
deps/ox/src/ox/std/algorithm.hpp
vendored
@ -9,13 +9,25 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "def.hpp"
|
#include "def.hpp"
|
||||||
|
#include "error.hpp"
|
||||||
|
|
||||||
OX_CLANG_NOWARN_BEGIN(-Wunsafe-buffer-usage)
|
OX_CLANG_NOWARN_BEGIN(-Wunsafe-buffer-usage)
|
||||||
|
|
||||||
namespace ox {
|
namespace ox {
|
||||||
|
|
||||||
template<typename It, typename T>
|
template<typename It, typename T>
|
||||||
constexpr It find(It begin, It end, const T &value) {
|
constexpr ox::Result<size_t> findIdx(It begin, It end, T const&value) {
|
||||||
|
auto it = begin;
|
||||||
|
for (; it != end; ++it) {
|
||||||
|
if (*it == value) {
|
||||||
|
return it.offset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ox::Error{1, "item not found"};
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename It, typename T>
|
||||||
|
constexpr It find(It begin, It end, T const&value) {
|
||||||
for (; begin != end; ++begin) {
|
for (; begin != end; ++begin) {
|
||||||
if (*begin == value) {
|
if (*begin == value) {
|
||||||
return begin;
|
return begin;
|
||||||
|
89
deps/ox/src/ox/std/anyptr.hpp
vendored
89
deps/ox/src/ox/std/anyptr.hpp
vendored
@ -15,18 +15,22 @@
|
|||||||
|
|
||||||
namespace ox {
|
namespace ox {
|
||||||
|
|
||||||
class AnyPtr {
|
namespace detail {
|
||||||
|
|
||||||
|
template<bool unique>
|
||||||
|
class AnyPtrT {
|
||||||
private:
|
private:
|
||||||
struct WrapBase {
|
struct WrapBase {
|
||||||
virtual constexpr ~WrapBase() = default;
|
virtual constexpr ~WrapBase() = default;
|
||||||
virtual constexpr WrapBase *copyTo(ox::Span<char> s) noexcept = 0;
|
virtual constexpr WrapBase *copyTo(ox::Span<char> s) noexcept = 0;
|
||||||
virtual constexpr operator bool() const noexcept = 0;
|
virtual constexpr operator bool() const noexcept = 0;
|
||||||
|
virtual void free() noexcept = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct Wrap: public WrapBase {
|
struct Wrap final: WrapBase {
|
||||||
T *data{};
|
T *data{};
|
||||||
constexpr Wrap(T *pData) noexcept: data(pData) {
|
explicit constexpr Wrap(T *pData) noexcept: data(pData) {
|
||||||
}
|
}
|
||||||
constexpr WrapBase *copyTo(ox::Span<char> s) noexcept override {
|
constexpr WrapBase *copyTo(ox::Span<char> s) noexcept override {
|
||||||
oxAssert(s.size() >= sizeof(Wrap), "too small buffer");
|
oxAssert(s.size() >= sizeof(Wrap), "too small buffer");
|
||||||
@ -39,39 +43,60 @@ class AnyPtr {
|
|||||||
constexpr operator bool() const noexcept override {
|
constexpr operator bool() const noexcept override {
|
||||||
return data != nullptr;
|
return data != nullptr;
|
||||||
}
|
}
|
||||||
|
constexpr void free() noexcept override {
|
||||||
|
safeDelete(data);
|
||||||
|
data = {};
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
WrapBase *m_wrapPtr{};
|
WrapBase *m_wrapPtr{};
|
||||||
ox::Array<char, sizeof(Wrap<void*>)> m_wrapData;
|
ox::Array<char, sizeof(Wrap<void*>)> m_wrapData;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
constexpr AnyPtr() noexcept = default;
|
constexpr AnyPtrT() noexcept = default;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr AnyPtr(T *ptr) noexcept {
|
constexpr AnyPtrT(T *ptr) noexcept {
|
||||||
if (std::is_constant_evaluated()) {
|
if (std::is_constant_evaluated()) {
|
||||||
m_wrapPtr = new Wrap(ptr);
|
m_wrapPtr = new Wrap<T>(ptr);
|
||||||
} else {
|
} else {
|
||||||
m_wrapPtr = new(m_wrapData.data()) Wrap(ptr);
|
m_wrapPtr = new(m_wrapData.data()) Wrap<T>(ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr AnyPtr(AnyPtr const&other) noexcept {
|
constexpr AnyPtrT(AnyPtrT const&other) noexcept requires(!unique) {
|
||||||
if (other) {
|
if (other) {
|
||||||
m_wrapPtr = other.m_wrapPtr->copyTo(m_wrapData);
|
m_wrapPtr = other.m_wrapPtr->copyTo(m_wrapData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr ~AnyPtr() noexcept {
|
constexpr AnyPtrT(AnyPtrT &&other) noexcept {
|
||||||
|
if (other) {
|
||||||
|
m_wrapPtr = other.m_wrapPtr->copyTo(m_wrapData);
|
||||||
|
if (std::is_constant_evaluated()) {
|
||||||
|
ox::safeDelete(m_wrapPtr);
|
||||||
|
}
|
||||||
|
other.m_wrapPtr = {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr ~AnyPtrT() noexcept {
|
||||||
|
if constexpr(unique) {
|
||||||
|
free();
|
||||||
|
}
|
||||||
if (std::is_constant_evaluated()) {
|
if (std::is_constant_evaluated()) {
|
||||||
ox::safeDelete(m_wrapPtr);
|
ox::safeDelete(m_wrapPtr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr AnyPtr &operator=(T *ptr) noexcept {
|
constexpr AnyPtrT &operator=(T *ptr) noexcept {
|
||||||
if (std::is_constant_evaluated()) {
|
if constexpr(unique) {
|
||||||
|
free();
|
||||||
|
} else if (std::is_constant_evaluated()) {
|
||||||
ox::safeDelete(m_wrapPtr);
|
ox::safeDelete(m_wrapPtr);
|
||||||
|
}
|
||||||
|
if (std::is_constant_evaluated()) {
|
||||||
m_wrapPtr = new Wrap(ptr);
|
m_wrapPtr = new Wrap(ptr);
|
||||||
} else {
|
} else {
|
||||||
m_wrapPtr = new(m_wrapData.data()) Wrap(ptr);
|
m_wrapPtr = new(m_wrapData.data()) Wrap(ptr);
|
||||||
@ -79,10 +104,12 @@ class AnyPtr {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr AnyPtr &operator=(AnyPtr const&ptr) noexcept {
|
constexpr AnyPtrT &operator=(AnyPtrT const&ptr) noexcept requires(!unique) {
|
||||||
if (this != &ptr) {
|
if (this != &ptr) {
|
||||||
if (ptr) {
|
if (std::is_constant_evaluated()) {
|
||||||
ox::safeDelete(m_wrapPtr);
|
ox::safeDelete(m_wrapPtr);
|
||||||
|
}
|
||||||
|
if (ptr) {
|
||||||
m_wrapPtr = ptr.m_wrapPtr->copyTo(m_wrapData);
|
m_wrapPtr = ptr.m_wrapPtr->copyTo(m_wrapData);
|
||||||
} else {
|
} else {
|
||||||
m_wrapPtr = nullptr;
|
m_wrapPtr = nullptr;
|
||||||
@ -91,10 +118,40 @@ class AnyPtr {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constexpr AnyPtrT &operator=(AnyPtrT &&ptr) noexcept {
|
||||||
|
if (this != &ptr) {
|
||||||
|
if constexpr(unique) {
|
||||||
|
free();
|
||||||
|
} else if (std::is_constant_evaluated()) {
|
||||||
|
ox::safeDelete(m_wrapPtr);
|
||||||
|
}
|
||||||
|
if (ptr) {
|
||||||
|
m_wrapPtr = ptr.m_wrapPtr->copyTo(m_wrapData);
|
||||||
|
if (std::is_constant_evaluated()) {
|
||||||
|
ox::safeDelete(ptr.m_wrapPtr);
|
||||||
|
ptr.m_wrapPtr = nullptr;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_wrapPtr = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
constexpr operator bool() const noexcept {
|
constexpr operator bool() const noexcept {
|
||||||
return m_wrapPtr && *m_wrapPtr;
|
return m_wrapPtr && *m_wrapPtr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constexpr void free() noexcept {
|
||||||
|
if (m_wrapPtr) {
|
||||||
|
m_wrapPtr->free();
|
||||||
|
}
|
||||||
|
if (std::is_constant_evaluated()) {
|
||||||
|
ox::safeDelete(m_wrapPtr);
|
||||||
|
}
|
||||||
|
m_wrapPtr = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr T *get() const noexcept {
|
constexpr T *get() const noexcept {
|
||||||
@ -104,6 +161,12 @@ class AnyPtr {
|
|||||||
return dynamic_cast<Wrap<T>*>(m_wrapPtr)->data;
|
return dynamic_cast<Wrap<T>*>(m_wrapPtr)->data;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
using AnyPtr = detail::AnyPtrT<false>;
|
||||||
|
using UAnyPtr = detail::AnyPtrT<true>;
|
||||||
|
|
||||||
}
|
}
|
4
deps/ox/src/ox/std/array.hpp
vendored
4
deps/ox/src/ox/std/array.hpp
vendored
@ -181,13 +181,13 @@ constexpr Array<T, ArraySize> &Array<T, ArraySize>::operator=(Array &&other) noe
|
|||||||
|
|
||||||
template<typename T, std::size_t ArraySize>
|
template<typename T, std::size_t ArraySize>
|
||||||
constexpr T &Array<T, ArraySize>::operator[](std::size_t i) noexcept {
|
constexpr T &Array<T, ArraySize>::operator[](std::size_t i) noexcept {
|
||||||
ox::primitiveAssert(__FILE__, __LINE__, i < size(), "Array access overflow");
|
boundsCheck(__FILE__, __LINE__, i, size(), "Array access overflow");
|
||||||
return m_items[i];
|
return m_items[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, std::size_t ArraySize>
|
template<typename T, std::size_t ArraySize>
|
||||||
constexpr const T &Array<T, ArraySize>::operator[](std::size_t i) const noexcept {
|
constexpr const T &Array<T, ArraySize>::operator[](std::size_t i) const noexcept {
|
||||||
ox::primitiveAssert(__FILE__, __LINE__, i < size(), "Array access overflow");
|
boundsCheck(__FILE__, __LINE__, i, size(), "Array access overflow");
|
||||||
return m_items[i];
|
return m_items[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
35
deps/ox/src/ox/std/assert.cpp
vendored
35
deps/ox/src/ox/std/assert.cpp
vendored
@ -7,6 +7,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "fmt.hpp"
|
#include "fmt.hpp"
|
||||||
|
#include "realstd.hpp"
|
||||||
#include "stacktrace.hpp"
|
#include "stacktrace.hpp"
|
||||||
#include "trace.hpp"
|
#include "trace.hpp"
|
||||||
|
|
||||||
@ -14,14 +15,14 @@
|
|||||||
|
|
||||||
namespace ox {
|
namespace ox {
|
||||||
|
|
||||||
void panic(StringViewCR file, int line, StringViewCR panicMsg, const Error &err) noexcept {
|
void panic(StringViewCR file, int const line, StringViewCR panicMsg, Error const&err) noexcept {
|
||||||
oxErrf("\033[31;1;1mPANIC:\033[0m [{}:{}]: {}\n", file, line, panicMsg);
|
oxErrf("\033[31;1;1mPANIC:\033[0m [{}:{}]: {}\n", file, line, panicMsg);
|
||||||
if (err.msg) {
|
if (err.msg) {
|
||||||
oxErrf("\tError Message:\t{}\n", err.msg);
|
oxErrf("\tError Message:\t{}\n", err.msg);
|
||||||
}
|
}
|
||||||
oxErrf("\tError Code:\t{}\n", static_cast<ErrorCode>(err));
|
oxErrf("\tError Code:\t{}\n", static_cast<ErrorCode>(err));
|
||||||
if (err.file != nullptr) {
|
if (err.src.file_name() != nullptr) {
|
||||||
oxErrf("\tError Location:\t{}:{}\n", err.file, err.line);
|
oxErrf("\tError Location:\t{}:{}\n", err.src.file_name(), err.src.line());
|
||||||
}
|
}
|
||||||
#ifdef OX_USE_STDLIB
|
#ifdef OX_USE_STDLIB
|
||||||
printStackTrace(2);
|
printStackTrace(2);
|
||||||
@ -32,16 +33,19 @@ void panic(StringViewCR file, int line, StringViewCR panicMsg, const Error &err)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void panic(const char *file, int line, const char *panicMsg, const Error &err) noexcept {
|
void panic(const char *file, int const line, char const*panicMsg, Error const&err) noexcept {
|
||||||
panic(StringView{file}, line, StringView{panicMsg}, err);
|
panic(StringView{file}, line, StringView{panicMsg}, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
void assertFailFuncRuntime(StringViewCR file, int line, StringViewCR assertTxt, StringViewCR msg) noexcept {
|
void assertFailFuncRuntime(
|
||||||
|
StringViewCR file,
|
||||||
|
int const line,
|
||||||
|
StringViewCR assertTxt,
|
||||||
|
StringViewCR msg) noexcept {
|
||||||
#ifdef OX_USE_STDLIB
|
#ifdef OX_USE_STDLIB
|
||||||
auto output = sfmt("\n\033[31;1;1mASSERT FAILURE:\033[0m [{}:{}]: {}\n", file, line, msg);
|
auto const st = genStackTrace(2);
|
||||||
output += genStackTrace(2);
|
oxTracef("assert", "Failed assert: {} ({}) [{}:{}]:\n{}", msg, assertTxt, file, line, st);
|
||||||
oxTracef("assert", "Failed assert: {} ({}) [{}:{}]", msg, assertTxt, file, line);
|
abort();
|
||||||
std::abort();
|
|
||||||
#else
|
#else
|
||||||
oxErrf("\n\033[31;1;1mASSERT FAILURE:\033[0m [{}:{}]: {}\n", file, line, msg);
|
oxErrf("\n\033[31;1;1mASSERT FAILURE:\033[0m [{}:{}]: {}\n", file, line, msg);
|
||||||
oxTracef("assert", "Failed assert: {} ({}) [{}:{}]", msg, assertTxt, file, line);
|
oxTracef("assert", "Failed assert: {} ({}) [{}:{}]", msg, assertTxt, file, line);
|
||||||
@ -49,20 +53,25 @@ void assertFailFuncRuntime(StringViewCR file, int line, StringViewCR assertTxt,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void assertFailFuncRuntime(StringViewCR file, int line, [[maybe_unused]] const Error &err, StringViewCR, StringViewCR assertMsg) noexcept {
|
void assertFailFuncRuntime(
|
||||||
|
StringViewCR file,
|
||||||
|
int const line,
|
||||||
|
[[maybe_unused]] Error const&err,
|
||||||
|
StringViewCR,
|
||||||
|
StringViewCR assertMsg) noexcept {
|
||||||
#if defined(OX_USE_STDLIB)
|
#if defined(OX_USE_STDLIB)
|
||||||
auto msg = sfmt("\n\033[31;1;1mASSERT FAILURE:\033[0m [{}:{}]: {}\n", file, line, assertMsg);
|
auto msg = sfmt("\n\033[31;1;1mASSERT FAILURE:\033[0m [{}:{}]: {}\n", file, line, assertMsg);
|
||||||
if (err.msg) {
|
if (err.msg) {
|
||||||
msg += sfmt("\tError Message:\t{}\n", err.msg);
|
msg += sfmt("\tError Message:\t{}\n", err.msg);
|
||||||
}
|
}
|
||||||
msg += sfmt("\tError Code:\t{}\n", static_cast<ErrorCode>(err));
|
msg += sfmt("\tError Code:\t{}\n", static_cast<ErrorCode>(err));
|
||||||
if (err.file != nullptr) {
|
if (err.src.file_name() != nullptr) {
|
||||||
msg += sfmt("\tError Location:\t{}:{}\n", err.file, err.line);
|
msg += sfmt("\tError Location:\t{}:{}\n", err.src.file_name(), err.src.line());
|
||||||
}
|
}
|
||||||
msg += genStackTrace(2);
|
msg += genStackTrace(2);
|
||||||
oxErr(msg);
|
oxErr(msg);
|
||||||
oxTracef("assert", "Failed assert: {} [{}:{}]", assertMsg, file, line);
|
oxTracef("assert", "Failed assert: {} [{}:{}]", assertMsg, file, line);
|
||||||
std::abort();
|
abort();
|
||||||
#else
|
#else
|
||||||
constexprPanic(file, line, assertMsg);
|
constexprPanic(file, line, assertMsg);
|
||||||
#endif
|
#endif
|
||||||
|
43
deps/ox/src/ox/std/assert.hpp
vendored
43
deps/ox/src/ox/std/assert.hpp
vendored
@ -22,9 +22,15 @@
|
|||||||
|
|
||||||
namespace ox {
|
namespace ox {
|
||||||
|
|
||||||
void panic(StringViewCR file, int line, StringViewCR panicMsg, const Error &err = ox::Error(0)) noexcept;
|
[[noreturn]]
|
||||||
|
void panic(StringViewCR file, int line, StringViewCR panicMsg, Error const&err = {}) noexcept;
|
||||||
|
|
||||||
constexpr void constexprPanic(StringViewCR file, int line, StringViewCR panicMsg, const Error &err = ox::Error(0)) noexcept {
|
[[noreturn]]
|
||||||
|
constexpr void constexprPanic(
|
||||||
|
StringViewCR file,
|
||||||
|
int const line,
|
||||||
|
StringViewCR panicMsg,
|
||||||
|
Error const&err = {}) noexcept {
|
||||||
if (!std::is_constant_evaluated()) {
|
if (!std::is_constant_evaluated()) {
|
||||||
panic(file, line, panicMsg, err);
|
panic(file, line, panicMsg, err);
|
||||||
} else {
|
} else {
|
||||||
@ -32,10 +38,24 @@ constexpr void constexprPanic(StringViewCR file, int line, StringViewCR panicMsg
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void assertFailFuncRuntime(StringViewCR file, int line, StringViewCR assertTxt, StringViewCR msg) noexcept;
|
void assertFailFuncRuntime(
|
||||||
void assertFailFuncRuntime(StringViewCR file, int line, const Error &err, StringViewCR, StringViewCR assertMsg) noexcept;
|
StringViewCR file,
|
||||||
|
int line,
|
||||||
|
StringViewCR assertTxt,
|
||||||
|
StringViewCR msg) noexcept;
|
||||||
|
void assertFailFuncRuntime(
|
||||||
|
StringViewCR file,
|
||||||
|
int line,
|
||||||
|
Error const&err,
|
||||||
|
StringViewCR,
|
||||||
|
StringViewCR assertMsg) noexcept;
|
||||||
|
|
||||||
constexpr void assertFunc(StringViewCR file, int line, bool pass, [[maybe_unused]]StringViewCR assertTxt, [[maybe_unused]]StringViewCR msg) noexcept {
|
constexpr void assertFunc(
|
||||||
|
StringViewCR file,
|
||||||
|
int const line,
|
||||||
|
bool const pass,
|
||||||
|
[[maybe_unused]]StringViewCR assertTxt,
|
||||||
|
[[maybe_unused]]StringViewCR msg) noexcept {
|
||||||
if (!pass) {
|
if (!pass) {
|
||||||
if (!std::is_constant_evaluated()) {
|
if (!std::is_constant_evaluated()) {
|
||||||
assertFailFuncRuntime(file, line, assertTxt, msg);
|
assertFailFuncRuntime(file, line, assertTxt, msg);
|
||||||
@ -45,7 +65,12 @@ constexpr void assertFunc(StringViewCR file, int line, bool pass, [[maybe_unused
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr void assertFunc(StringViewCR file, int line, const Error &err, StringViewCR, StringViewCR assertMsg) noexcept {
|
constexpr void assertFunc(
|
||||||
|
StringViewCR file,
|
||||||
|
int const line,
|
||||||
|
Error const&err,
|
||||||
|
StringViewCR,
|
||||||
|
StringViewCR assertMsg) noexcept {
|
||||||
if (err) {
|
if (err) {
|
||||||
if (!std::is_constant_evaluated()) {
|
if (!std::is_constant_evaluated()) {
|
||||||
assertFailFuncRuntime(file, line, err, {}, assertMsg);
|
assertFailFuncRuntime(file, line, err, {}, assertMsg);
|
||||||
@ -55,7 +80,11 @@ constexpr void assertFunc(StringViewCR file, int line, const Error &err, StringV
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr void expect(StringViewCR file, int line, const auto &actual, const auto &expected) noexcept {
|
constexpr void expect(
|
||||||
|
StringViewCR file,
|
||||||
|
int const line,
|
||||||
|
auto const&actual,
|
||||||
|
auto const&expected) noexcept {
|
||||||
if (actual != expected) {
|
if (actual != expected) {
|
||||||
if (!std::is_constant_evaluated()) {
|
if (!std::is_constant_evaluated()) {
|
||||||
#if defined(OX_USE_STDLIB)
|
#if defined(OX_USE_STDLIB)
|
||||||
|
9
deps/ox/src/ox/std/cstrops.hpp
vendored
9
deps/ox/src/ox/std/cstrops.hpp
vendored
@ -30,9 +30,12 @@ constexpr T1 strncpy(T1 dest, T2 src, std::size_t maxLen) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr auto strnlen(const char *str1, std::size_t maxLen) noexcept {
|
constexpr size_t strnlen_s(const char *str, size_t const maxLen) noexcept {
|
||||||
std::size_t len = 0;
|
if (!str) [[unlikely]] {
|
||||||
for (; len < maxLen && str1[len]; len++);
|
return 0;
|
||||||
|
}
|
||||||
|
size_t len = 0;
|
||||||
|
for (; len < maxLen && str[len]; len++);
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
6
deps/ox/src/ox/std/defines.hpp
vendored
6
deps/ox/src/ox/std/defines.hpp
vendored
@ -41,6 +41,12 @@ constexpr auto Debug = true;
|
|||||||
constexpr auto Debug = false;
|
constexpr auto Debug = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(OX_CHECK_BOUNDS)
|
||||||
|
constexpr auto CheckBounds = true;
|
||||||
|
#else
|
||||||
|
constexpr auto CheckBounds = Debug;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(NDEBUG)
|
#if defined(NDEBUG)
|
||||||
constexpr auto NDebug = true;
|
constexpr auto NDebug = true;
|
||||||
#else
|
#else
|
||||||
|
60
deps/ox/src/ox/std/error.hpp
vendored
60
deps/ox/src/ox/std/error.hpp
vendored
@ -36,28 +36,16 @@ using ErrorCode = uint16_t;
|
|||||||
|
|
||||||
|
|
||||||
struct [[nodiscard]] Error {
|
struct [[nodiscard]] Error {
|
||||||
|
std::source_location src;
|
||||||
ox::CString msg = nullptr;
|
ox::CString msg = nullptr;
|
||||||
ox::CString file = nullptr;
|
|
||||||
uint16_t line = 0;
|
|
||||||
ErrorCode errCode = 0;
|
ErrorCode errCode = 0;
|
||||||
|
|
||||||
constexpr Error() noexcept = default;
|
constexpr Error() noexcept = default;
|
||||||
|
|
||||||
explicit constexpr Error(
|
|
||||||
ox::CString file,
|
|
||||||
uint32_t const line,
|
|
||||||
ErrorCode const errCode,
|
|
||||||
ox::CString msg = nullptr) noexcept:
|
|
||||||
msg{msg},
|
|
||||||
file{file},
|
|
||||||
line{static_cast<uint16_t>(line)},
|
|
||||||
errCode{errCode} {}
|
|
||||||
|
|
||||||
explicit constexpr Error(
|
explicit constexpr Error(
|
||||||
ErrorCode const errCode,
|
ErrorCode const errCode,
|
||||||
std::source_location const&src = std::source_location::current()) noexcept:
|
std::source_location const&src = std::source_location::current()) noexcept:
|
||||||
file{src.file_name()},
|
src{src},
|
||||||
line{static_cast<uint16_t>(src.line())},
|
|
||||||
errCode{errCode}
|
errCode{errCode}
|
||||||
{}
|
{}
|
||||||
|
|
||||||
@ -65,9 +53,8 @@ struct [[nodiscard]] Error {
|
|||||||
ErrorCode const errCode,
|
ErrorCode const errCode,
|
||||||
ox::CString msg,
|
ox::CString msg,
|
||||||
std::source_location const&src = std::source_location::current()) noexcept:
|
std::source_location const&src = std::source_location::current()) noexcept:
|
||||||
|
src{src},
|
||||||
msg{msg},
|
msg{msg},
|
||||||
file{src.file_name()},
|
|
||||||
line{static_cast<uint16_t>(src.line())},
|
|
||||||
errCode{errCode}
|
errCode{errCode}
|
||||||
{}
|
{}
|
||||||
|
|
||||||
@ -89,42 +76,31 @@ constexpr auto toStr(Error const&err) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct Exception: public std::exception {
|
struct Exception: public std::exception {
|
||||||
|
std::source_location src;
|
||||||
ox::CString msg = nullptr;
|
ox::CString msg = nullptr;
|
||||||
ox::CString file = nullptr;
|
|
||||||
uint16_t line = 0;
|
|
||||||
ErrorCode errCode = 0;
|
ErrorCode errCode = 0;
|
||||||
|
|
||||||
explicit inline Exception(ox::CString file, uint32_t line, ErrorCode errCode, char const*msg = "") noexcept {
|
explicit Exception(
|
||||||
this->file = file;
|
|
||||||
this->line = static_cast<uint16_t>(line);
|
|
||||||
this->msg = msg;
|
|
||||||
this->errCode = errCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit inline Exception(
|
|
||||||
ErrorCode const errCode,
|
ErrorCode const errCode,
|
||||||
std::source_location const&src = std::source_location::current()) noexcept:
|
std::source_location const&src = std::source_location::current()) noexcept:
|
||||||
file{src.file_name()},
|
src{src},
|
||||||
line{static_cast<uint16_t>(src.line())},
|
|
||||||
errCode{errCode} {}
|
errCode{errCode} {}
|
||||||
|
|
||||||
explicit inline Exception(
|
explicit Exception(
|
||||||
ErrorCode const errCode,
|
ErrorCode const errCode,
|
||||||
ox::CString msg,
|
ox::CString msg,
|
||||||
std::source_location const&src = std::source_location::current()) noexcept:
|
std::source_location const&src = std::source_location::current()) noexcept:
|
||||||
|
src{src},
|
||||||
msg{msg},
|
msg{msg},
|
||||||
file{src.file_name()},
|
|
||||||
line{static_cast<uint16_t>(src.line())},
|
|
||||||
errCode{errCode} {}
|
errCode{errCode} {}
|
||||||
|
|
||||||
explicit inline Exception(Error const&err) noexcept:
|
explicit Exception(Error const&err) noexcept:
|
||||||
|
src{err.src},
|
||||||
msg{err.msg ? err.msg : ""},
|
msg{err.msg ? err.msg : ""},
|
||||||
file{err.file},
|
|
||||||
line{err.line},
|
|
||||||
errCode{err.errCode} {}
|
errCode{err.errCode} {}
|
||||||
|
|
||||||
constexpr Error toError() const noexcept {
|
constexpr Error toError() const noexcept {
|
||||||
return Error(file, line, errCode, msg);
|
return Error(errCode, msg, src);
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
@ -133,6 +109,7 @@ struct Exception: public std::exception {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
[[noreturn]]
|
||||||
void panic(char const*file, int line, char const*panicMsg, Error const&err) noexcept;
|
void panic(char const*file, int line, char const*panicMsg, Error const&err) noexcept;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@ -353,4 +330,17 @@ constexpr void primitiveAssert(char const*file, int line, bool pass, char const*
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constexpr void boundsCheck(
|
||||||
|
char const*file,
|
||||||
|
int const line,
|
||||||
|
size_t const i,
|
||||||
|
size_t const sz,
|
||||||
|
char const*msg) noexcept {
|
||||||
|
if constexpr(defines::CheckBounds) {
|
||||||
|
if (i >= sz) [[unlikely]] {
|
||||||
|
panic(file, line, msg, ox::Error{1});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
132
deps/ox/src/ox/std/hashmap.hpp
vendored
132
deps/ox/src/ox/std/hashmap.hpp
vendored
@ -11,6 +11,7 @@
|
|||||||
#include "algorithm.hpp"
|
#include "algorithm.hpp"
|
||||||
#include "hash.hpp"
|
#include "hash.hpp"
|
||||||
#include "ignore.hpp"
|
#include "ignore.hpp"
|
||||||
|
#include "optional.hpp"
|
||||||
#include "stringview.hpp"
|
#include "stringview.hpp"
|
||||||
#include "strops.hpp"
|
#include "strops.hpp"
|
||||||
#include "vector.hpp"
|
#include "vector.hpp"
|
||||||
@ -26,11 +27,12 @@ class HashMap {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
struct Pair {
|
struct Pair {
|
||||||
|
UPtr<Pair> next;
|
||||||
K key = {};
|
K key = {};
|
||||||
T value{};
|
T value{};
|
||||||
};
|
};
|
||||||
Vector<K> m_keys;
|
Vector<K> m_keys;
|
||||||
Vector<Pair*> m_pairs;
|
Vector<UPtr<Pair>> m_pairs;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit constexpr HashMap(std::size_t size = 127);
|
explicit constexpr HashMap(std::size_t size = 127);
|
||||||
@ -73,10 +75,10 @@ class HashMap {
|
|||||||
constexpr void expand();
|
constexpr void expand();
|
||||||
|
|
||||||
template<typename KK>
|
template<typename KK>
|
||||||
constexpr Pair *const&access(Vector<Pair*> const&pairs, KK const&key) const;
|
constexpr UPtr<Pair> const &access(Vector<UPtr<Pair>> const &pairs, KK const &key) const;
|
||||||
|
|
||||||
template<typename KK>
|
template<typename KK>
|
||||||
constexpr Pair *&access(Vector<Pair*> &pairs, KK const&key);
|
constexpr UPtr<Pair> &access(Vector<UPtr<Pair>> &pairs, KK const &key);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -85,14 +87,13 @@ constexpr HashMap<K, T>::HashMap(std::size_t size): m_pairs(size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename K, typename T>
|
template<typename K, typename T>
|
||||||
constexpr HashMap<K, T>::HashMap(HashMap<K, T> const&other) {
|
constexpr HashMap<K, T>::HashMap(HashMap const &other) {
|
||||||
m_pairs = other.m_pairs;
|
operator=(other);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename K, typename T>
|
template<typename K, typename T>
|
||||||
constexpr HashMap<K, T>::HashMap(HashMap<K, T> &&other) noexcept {
|
constexpr HashMap<K, T>::HashMap(HashMap &&other) noexcept {
|
||||||
m_keys = std::move(other.m_keys);
|
operator=(std::move(other));
|
||||||
m_pairs = std::move(other.m_pairs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename K, typename T>
|
template<typename K, typename T>
|
||||||
@ -101,7 +102,7 @@ constexpr HashMap<K, T>::~HashMap() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename K, typename T>
|
template<typename K, typename T>
|
||||||
constexpr bool HashMap<K, T>::operator==(HashMap const&other) const {
|
constexpr bool HashMap<K, T>::operator==(HashMap const &other) const {
|
||||||
if (m_keys != other.m_keys) {
|
if (m_keys != other.m_keys) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -115,19 +116,25 @@ constexpr bool HashMap<K, T>::operator==(HashMap const&other) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename K, typename T>
|
template<typename K, typename T>
|
||||||
constexpr HashMap<K, T> &HashMap<K, T>::operator=(HashMap<K, T> const&other) {
|
constexpr HashMap<K, T> &HashMap<K, T>::operator=(HashMap const &other) {
|
||||||
if (this != &other) {
|
if (this != &other) {
|
||||||
clear();
|
clear();
|
||||||
m_keys = other.m_keys;
|
m_keys = other.m_keys;
|
||||||
m_pairs = other.m_pairs;
|
m_pairs.resize(other.m_pairs.size());
|
||||||
|
for (auto const&k : m_keys) {
|
||||||
|
auto const &src = access(other.m_pairs, k);
|
||||||
|
auto &dst = access(m_pairs, k);
|
||||||
|
dst = ox::make_unique<Pair>();
|
||||||
|
dst->key = src->key;
|
||||||
|
dst->value = src->value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename K, typename T>
|
template<typename K, typename T>
|
||||||
constexpr HashMap<K, T> &HashMap<K, T>::operator=(HashMap<K, T> &&other) noexcept {
|
constexpr HashMap<K, T> &HashMap<K, T>::operator=(HashMap &&other) noexcept {
|
||||||
if (this != &other) {
|
if (this != &other) {
|
||||||
clear();
|
|
||||||
m_keys = std::move(other.m_keys);
|
m_keys = std::move(other.m_keys);
|
||||||
m_pairs = std::move(other.m_pairs);
|
m_pairs = std::move(other.m_pairs);
|
||||||
}
|
}
|
||||||
@ -135,60 +142,52 @@ constexpr HashMap<K, T> &HashMap<K, T>::operator=(HashMap<K, T> &&other) noexcep
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename K, typename T>
|
template<typename K, typename T>
|
||||||
constexpr T &HashMap<K, T>::operator[](MaybeView_t<K> const&k) {
|
constexpr T &HashMap<K, T>::operator[](MaybeView_t<K> const &key) {
|
||||||
auto p = &access(m_pairs, k);
|
auto p = &access(m_pairs, key);
|
||||||
if (*p == nullptr) {
|
if (*p == nullptr) {
|
||||||
if (static_cast<double>(m_pairs.size()) * 0.7 <
|
if (static_cast<double>(m_pairs.size()) * 0.7 <
|
||||||
static_cast<double>(m_keys.size())) {
|
static_cast<double>(m_keys.size())) {
|
||||||
expand();
|
expand();
|
||||||
p = &access(m_pairs, k);
|
p = &access(m_pairs, key);
|
||||||
}
|
}
|
||||||
*p = new Pair;
|
*p = ox::make_unique<Pair>();
|
||||||
(*p)->key = k;
|
(*p)->key = key;
|
||||||
m_keys.emplace_back(k);
|
m_keys.emplace_back(key);
|
||||||
}
|
}
|
||||||
return (*p)->value;
|
return (*p)->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename K, typename T>
|
template<typename K, typename T>
|
||||||
constexpr Result<T*> HashMap<K, T>::at(MaybeView_t<K> const&k) noexcept {
|
constexpr Result<T*> HashMap<K, T>::at(MaybeView_t<K> const &key) noexcept {
|
||||||
auto p = access(m_pairs, k);
|
auto &p = access(m_pairs, key);
|
||||||
if (!p) {
|
if (!p) {
|
||||||
return {nullptr, ox::Error(1, "value not found for given key")};
|
return ox::Error{1, "value not found for given key"};
|
||||||
}
|
}
|
||||||
return &p->value;
|
return &p->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename K, typename T>
|
template<typename K, typename T>
|
||||||
constexpr Result<const T*> HashMap<K, T>::at(MaybeView_t<K> const&k) const noexcept {
|
constexpr Result<const T*> HashMap<K, T>::at(MaybeView_t<K> const &key) const noexcept {
|
||||||
auto p = access(m_pairs, k);
|
auto &p = access(m_pairs, key);
|
||||||
if (!p) {
|
if (!p) {
|
||||||
return {nullptr, ox::Error(1, "value not found for given key")};
|
return ox::Error{1, "value not found for given key"};
|
||||||
}
|
}
|
||||||
return &p->value;
|
return &p->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename K, typename T>
|
template<typename K, typename T>
|
||||||
constexpr void HashMap<K, T>::erase(MaybeView_t<K> const&k) {
|
constexpr void HashMap<K, T>::erase(MaybeView_t<K> const &key) {
|
||||||
if (!contains(k)) {
|
if (!contains(key)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto h = ox::hash<MaybeView_t<K>>{}(k) % m_pairs.size();
|
auto &c = access(m_pairs, key);
|
||||||
while (true) {
|
c = std::move(c->next);
|
||||||
const auto &p = m_pairs[h];
|
std::ignore = m_keys.erase(ox::find(m_keys.begin(), m_keys.end(), key));
|
||||||
if (p == nullptr || p->key == k) {
|
|
||||||
std::ignore = m_pairs.erase(h);
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
h = ox::hash<MaybeView_t<K>>{}(k) % m_pairs.size();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::ignore = m_keys.erase(ox::find(m_keys.begin(), m_keys.end(), k));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename K, typename T>
|
template<typename K, typename T>
|
||||||
constexpr bool HashMap<K, T>::contains(MaybeView_t<K> const&k) const noexcept {
|
constexpr bool HashMap<K, T>::contains(MaybeView_t<K> const &key) const noexcept {
|
||||||
return access(m_pairs, k) != nullptr;
|
return access(m_pairs, key).get() != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename K, typename T>
|
template<typename K, typename T>
|
||||||
@ -204,27 +203,26 @@ constexpr Vector<K> const&HashMap<K, T>::keys() const noexcept {
|
|||||||
template<typename K, typename T>
|
template<typename K, typename T>
|
||||||
constexpr Vector<T> HashMap<K, T>::values() const noexcept {
|
constexpr Vector<T> HashMap<K, T>::values() const noexcept {
|
||||||
Vector<T> out;
|
Vector<T> out;
|
||||||
out.reserve(m_pairs.size());
|
out.reserve(m_keys.size());
|
||||||
for (auto const&p : m_pairs) {
|
for (auto const &p : m_pairs) {
|
||||||
out.emplace_back(p->value);
|
if (out) {
|
||||||
|
out.emplace_back(p->value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename K, typename T>
|
template<typename K, typename T>
|
||||||
constexpr void HashMap<K, T>::clear() {
|
constexpr void HashMap<K, T>::clear() {
|
||||||
for (std::size_t i = 0; i < m_pairs.size(); i++) {
|
|
||||||
delete m_pairs[i];
|
|
||||||
}
|
|
||||||
m_pairs.clear();
|
m_pairs.clear();
|
||||||
m_pairs.resize(127);
|
m_pairs.resize(127);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename K, typename T>
|
template<typename K, typename T>
|
||||||
constexpr void HashMap<K, T>::expand() {
|
constexpr void HashMap<K, T>::expand() {
|
||||||
Vector<Pair*> r(m_pairs.size() * 2);
|
Vector<UPtr<Pair>> r{m_pairs.size() * 2};
|
||||||
for (std::size_t i = 0; i < m_keys.size(); ++i) {
|
for (std::size_t i = 0; i < m_keys.size(); ++i) {
|
||||||
auto const&k = m_keys[i];
|
auto const &k = m_keys[i];
|
||||||
access(r, k) = std::move(access(m_pairs, k));
|
access(r, k) = std::move(access(m_pairs, k));
|
||||||
}
|
}
|
||||||
m_pairs = std::move(r);
|
m_pairs = std::move(r);
|
||||||
@ -232,29 +230,39 @@ constexpr void HashMap<K, T>::expand() {
|
|||||||
|
|
||||||
template<typename K, typename T>
|
template<typename K, typename T>
|
||||||
template<typename KK>
|
template<typename KK>
|
||||||
constexpr typename HashMap<K, T>::Pair *const&HashMap<K, T>::access(Vector<Pair*> const&pairs, KK const&k) const {
|
constexpr UPtr<typename HashMap<K, T>::Pair> const &HashMap<K, T>::access(
|
||||||
auto h = static_cast<std::size_t>(ox::hash<KK>{}(k) % pairs.size());
|
Vector<UPtr<Pair>> const& pairs,
|
||||||
|
KK const &key) const {
|
||||||
|
auto const h = static_cast<std::size_t>(ox::hash<KK>{}(key) % pairs.size());
|
||||||
|
auto const &p = *pairs.at(h).unwrap();
|
||||||
|
if (p == nullptr || p->key == key) {
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
auto c = &p->next;
|
||||||
while (true) {
|
while (true) {
|
||||||
auto const&p = *pairs.at(h).unwrap();
|
if (*c == nullptr || (*c)->key == key) {
|
||||||
if (p == nullptr || p->key == k) {
|
return *c;
|
||||||
return p;
|
|
||||||
} else {
|
|
||||||
h = (h + 1) % pairs.size();
|
|
||||||
}
|
}
|
||||||
|
c = &(*c)->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename K, typename T>
|
template<typename K, typename T>
|
||||||
template<typename KK>
|
template<typename KK>
|
||||||
constexpr typename HashMap<K, T>::Pair *&HashMap<K, T>::access(Vector<Pair*> &pairs, KK const&k) {
|
constexpr UPtr<typename HashMap<K, T>::Pair> &HashMap<K, T>::access(
|
||||||
auto h = static_cast<std::size_t>(ox::hash<KK>{}(k) % pairs.size());
|
Vector<UPtr<Pair>> &pairs,
|
||||||
|
KK const &key) {
|
||||||
|
auto const h = static_cast<std::size_t>(ox::hash<KK>{}(key) % pairs.size());
|
||||||
|
auto &p = *pairs.at(h).unwrap();
|
||||||
|
if (p == nullptr || p->key == key) {
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
auto c = &p->next;
|
||||||
while (true) {
|
while (true) {
|
||||||
auto &p = *pairs.at(h).unwrap();
|
if (*c == nullptr || (*c)->key == key) {
|
||||||
if (p == nullptr || p->key == k) {
|
return *c;
|
||||||
return p;
|
|
||||||
} else {
|
|
||||||
h = (h + 1) % pairs.size();
|
|
||||||
}
|
}
|
||||||
|
c = &(*c)->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
deps/ox/src/ox/std/istring.hpp
vendored
2
deps/ox/src/ox/std/istring.hpp
vendored
@ -245,7 +245,7 @@ struct MaybeView<ox::IString<sz>> {
|
|||||||
|
|
||||||
template<Integer_c Integer>
|
template<Integer_c Integer>
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr auto itoa(Integer v) noexcept {
|
constexpr auto intToStr(Integer v) noexcept {
|
||||||
constexpr auto Cap = [] {
|
constexpr auto Cap = [] {
|
||||||
auto out = 0;
|
auto out = 0;
|
||||||
switch (sizeof(Integer)) {
|
switch (sizeof(Integer)) {
|
||||||
|
6
deps/ox/src/ox/std/iterator.hpp
vendored
6
deps/ox/src/ox/std/iterator.hpp
vendored
@ -133,17 +133,17 @@ struct SpanIterator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constexpr PtrType operator->() const noexcept {
|
constexpr PtrType operator->() const noexcept {
|
||||||
ox::primitiveAssert(__FILE__, __LINE__, m_offset < m_max, "SpanIterator access overflow");
|
boundsCheck(__FILE__, __LINE__, m_offset, m_max, "SpanIterator access overflow");
|
||||||
return &m_t[m_offset];
|
return &m_t[m_offset];
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr RefType operator*() const noexcept {
|
constexpr RefType operator*() const noexcept {
|
||||||
ox::primitiveAssert(__FILE__, __LINE__, m_offset < m_max, "SpanIterator access overflow");
|
boundsCheck(__FILE__, __LINE__, m_offset, m_max, "SpanIterator access overflow");
|
||||||
return m_t[m_offset];
|
return m_t[m_offset];
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr RefType operator[](std::size_t s) const noexcept {
|
constexpr RefType operator[](std::size_t s) const noexcept {
|
||||||
ox::primitiveAssert(__FILE__, __LINE__, s < m_max, "SpanIterator access overflow");
|
boundsCheck(__FILE__, __LINE__, s, m_max, "SpanIterator access overflow");
|
||||||
return m_t[s];
|
return m_t[s];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
deps/ox/src/ox/std/memory.hpp
vendored
4
deps/ox/src/ox/std/memory.hpp
vendored
@ -260,12 +260,12 @@ constexpr bool operator==(const UniquePtr<T> &p1, const UniquePtr<T> &p2) noexce
|
|||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr bool operator==(const UniquePtr<T> &p1, std::nullptr_t) noexcept {
|
constexpr bool operator==(const UniquePtr<T> &p1, std::nullptr_t) noexcept {
|
||||||
return p1.get();
|
return p1.get() == nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr bool operator==(std::nullptr_t, const UniquePtr<T> &p2) noexcept {
|
constexpr bool operator==(std::nullptr_t, const UniquePtr<T> &p2) noexcept {
|
||||||
return p2.get();
|
return p2.get() == nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
1
deps/ox/src/ox/std/reader.hpp
vendored
1
deps/ox/src/ox/std/reader.hpp
vendored
@ -31,7 +31,6 @@ concept Reader_c = requires(T v) {
|
|||||||
class Reader_v {
|
class Reader_v {
|
||||||
public:
|
public:
|
||||||
virtual constexpr ~Reader_v() noexcept = default;
|
virtual constexpr ~Reader_v() noexcept = default;
|
||||||
[[nodiscard]]
|
|
||||||
virtual constexpr ox::Result<char> peek() const noexcept = 0;
|
virtual constexpr ox::Result<char> peek() const noexcept = 0;
|
||||||
virtual constexpr ox::Result<std::size_t> read(char*, std::size_t) noexcept = 0;
|
virtual constexpr ox::Result<std::size_t> read(char*, std::size_t) noexcept = 0;
|
||||||
virtual constexpr ox::Result<std::size_t> tellg() noexcept = 0;
|
virtual constexpr ox::Result<std::size_t> tellg() noexcept = 0;
|
||||||
|
9
deps/ox/src/ox/std/realstd.hpp
vendored
9
deps/ox/src/ox/std/realstd.hpp
vendored
@ -12,4 +12,13 @@
|
|||||||
#include <cassert>
|
#include <cassert>
|
||||||
#else
|
#else
|
||||||
#define assert(e) while (!(e));
|
#define assert(e) while (!(e));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __has_include(<cstdlib>)
|
||||||
|
#include <cstdlib>
|
||||||
|
#else
|
||||||
|
extern "C" {
|
||||||
|
[[noreturn]]
|
||||||
|
void abort();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
59
deps/ox/src/ox/std/smallmap.hpp
vendored
59
deps/ox/src/ox/std/smallmap.hpp
vendored
@ -62,6 +62,9 @@ class SmallMap {
|
|||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr Vector<K> keys() const noexcept;
|
constexpr Vector<K> keys() const noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
constexpr Vector<T> values() const noexcept;
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr K const&key(size_t i) const noexcept;
|
constexpr K const&key(size_t i) const noexcept;
|
||||||
|
|
||||||
@ -82,14 +85,22 @@ class SmallMap {
|
|||||||
return m_pairs;
|
return m_pairs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
constexpr ox::Span<Pair> pairs() noexcept {
|
||||||
|
return m_pairs;
|
||||||
|
}
|
||||||
|
|
||||||
constexpr void clear();
|
constexpr void clear();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template<typename KK>
|
template<typename KK>
|
||||||
constexpr Pair const&access(PairVector const&pairs, KK const&key, bool &isNew) const;
|
constexpr Pair const*access(PairVector const&pairs, KK const&key, bool &isNew) const;
|
||||||
|
|
||||||
template<typename KK>
|
template<typename KK>
|
||||||
constexpr Pair &access(PairVector &pairs, KK const&key, bool &isNew);
|
constexpr Pair *access(PairVector &pairs, KK const&key, bool &isNew);
|
||||||
|
|
||||||
|
template<typename KK>
|
||||||
|
constexpr Pair *accessNoCreate(PairVector &pairs, KK const&key);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -129,7 +140,7 @@ constexpr SmallMap<K, T, SmallSz> &SmallMap<K, T, SmallSz>::operator=(SmallMap<K
|
|||||||
template<typename K, typename T, size_t SmallSz>
|
template<typename K, typename T, size_t SmallSz>
|
||||||
constexpr T &SmallMap<K, T, SmallSz>::operator[](MaybeView_t<K> const&k) {
|
constexpr T &SmallMap<K, T, SmallSz>::operator[](MaybeView_t<K> const&k) {
|
||||||
bool isNew{};
|
bool isNew{};
|
||||||
auto p = &access(m_pairs, k, isNew);
|
auto p = access(m_pairs, k, isNew);
|
||||||
if (isNew) {
|
if (isNew) {
|
||||||
p->key = k;
|
p->key = k;
|
||||||
}
|
}
|
||||||
@ -138,7 +149,7 @@ constexpr T &SmallMap<K, T, SmallSz>::operator[](MaybeView_t<K> const&k) {
|
|||||||
|
|
||||||
template<typename K, typename T, size_t SmallSz>
|
template<typename K, typename T, size_t SmallSz>
|
||||||
constexpr Result<T*> SmallMap<K, T, SmallSz>::at(MaybeView_t<K> const&k) noexcept {
|
constexpr Result<T*> SmallMap<K, T, SmallSz>::at(MaybeView_t<K> const&k) noexcept {
|
||||||
auto p = access(m_pairs, k);
|
auto const p = accessNoCreate(m_pairs, k);
|
||||||
if (!p) {
|
if (!p) {
|
||||||
return {nullptr, ox::Error(1, "value not found for given key")};
|
return {nullptr, ox::Error(1, "value not found for given key")};
|
||||||
}
|
}
|
||||||
@ -147,7 +158,8 @@ constexpr Result<T*> SmallMap<K, T, SmallSz>::at(MaybeView_t<K> const&k) noexcep
|
|||||||
|
|
||||||
template<typename K, typename T, size_t SmallSz>
|
template<typename K, typename T, size_t SmallSz>
|
||||||
constexpr Result<const T*> SmallMap<K, T, SmallSz>::at(MaybeView_t<K> const&k) const noexcept {
|
constexpr Result<const T*> SmallMap<K, T, SmallSz>::at(MaybeView_t<K> const&k) const noexcept {
|
||||||
auto p = access(m_pairs, k);
|
bool isNew{};
|
||||||
|
auto p = access(m_pairs, k, isNew);
|
||||||
if (!p) {
|
if (!p) {
|
||||||
return {nullptr, ox::Error(1, "value not found for given key")};
|
return {nullptr, ox::Error(1, "value not found for given key")};
|
||||||
}
|
}
|
||||||
@ -168,7 +180,8 @@ constexpr void SmallMap<K, T, SmallSz>::erase(MaybeView_t<K> const&k) {
|
|||||||
|
|
||||||
template<typename K, typename T, size_t SmallSz>
|
template<typename K, typename T, size_t SmallSz>
|
||||||
constexpr bool SmallMap<K, T, SmallSz>::contains(MaybeView_t<K> const&k) const noexcept {
|
constexpr bool SmallMap<K, T, SmallSz>::contains(MaybeView_t<K> const&k) const noexcept {
|
||||||
return access(m_pairs, k) != nullptr;
|
bool isNew{};
|
||||||
|
return access(m_pairs, k, isNew) != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename K, typename T, size_t SmallSz>
|
template<typename K, typename T, size_t SmallSz>
|
||||||
@ -186,6 +199,16 @@ constexpr Vector<K> SmallMap<K, T, SmallSz>::keys() const noexcept {
|
|||||||
return keys;
|
return keys;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename K, typename T, size_t SmallSz>
|
||||||
|
constexpr Vector<T> SmallMap<K, T, SmallSz>::values() const noexcept {
|
||||||
|
ox::Vector<T> keys;
|
||||||
|
keys.reserve(m_pairs.size());
|
||||||
|
for (auto const&p : m_pairs) {
|
||||||
|
keys.emplace_back(p.key);
|
||||||
|
}
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
|
||||||
template<typename K, typename T, size_t SmallSz>
|
template<typename K, typename T, size_t SmallSz>
|
||||||
constexpr K const&SmallMap<K, T, SmallSz>::key(size_t i) const noexcept {
|
constexpr K const&SmallMap<K, T, SmallSz>::key(size_t i) const noexcept {
|
||||||
return m_pairs[i].key;
|
return m_pairs[i].key;
|
||||||
@ -218,30 +241,42 @@ constexpr void SmallMap<K, T, SmallSz>::clear() {
|
|||||||
|
|
||||||
template<typename K, typename T, size_t SmallSz>
|
template<typename K, typename T, size_t SmallSz>
|
||||||
template<typename KK>
|
template<typename KK>
|
||||||
constexpr typename SmallMap<K, T, SmallSz>::Pair const&SmallMap<K, T, SmallSz>::access(
|
constexpr typename SmallMap<K, T, SmallSz>::Pair const*SmallMap<K, T, SmallSz>::access(
|
||||||
PairVector const&pairs, KK const&k, bool &isNew) const {
|
PairVector const&pairs, KK const&k, bool &isNew) const {
|
||||||
for (auto const&p : pairs) {
|
for (auto const&p : pairs) {
|
||||||
if (p.key == k) {
|
if (p.key == k) {
|
||||||
isNew = false;
|
isNew = false;
|
||||||
return p;
|
return &p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
isNew = true;
|
isNew = true;
|
||||||
return pairs.emplace_back();
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename K, typename T, size_t SmallSz>
|
template<typename K, typename T, size_t SmallSz>
|
||||||
template<typename KK>
|
template<typename KK>
|
||||||
constexpr typename SmallMap<K, T, SmallSz>::Pair &SmallMap<K, T, SmallSz>::access(
|
constexpr typename SmallMap<K, T, SmallSz>::Pair *SmallMap<K, T, SmallSz>::access(
|
||||||
PairVector &pairs, KK const&k, bool &isNew) {
|
PairVector &pairs, KK const&k, bool &isNew) {
|
||||||
for (auto &p : pairs) {
|
for (auto &p : pairs) {
|
||||||
if (p.key == k) {
|
if (p.key == k) {
|
||||||
isNew = false;
|
isNew = false;
|
||||||
return p;
|
return &p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
isNew = true;
|
isNew = true;
|
||||||
return pairs.emplace_back();
|
return &pairs.emplace_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename K, typename T, size_t SmallSz>
|
||||||
|
template<typename KK>
|
||||||
|
constexpr typename SmallMap<K, T, SmallSz>::Pair *SmallMap<K, T, SmallSz>::accessNoCreate(
|
||||||
|
PairVector &pairs, KK const&k) {
|
||||||
|
for (auto &p : pairs) {
|
||||||
|
if (p.key == k) {
|
||||||
|
return &p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, typename K, typename V, size_t SmallSz>
|
template<typename T, typename K, typename V, size_t SmallSz>
|
||||||
|
46
deps/ox/src/ox/std/span.hpp
vendored
46
deps/ox/src/ox/std/span.hpp
vendored
@ -8,13 +8,17 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#if __has_include(<array>)
|
||||||
|
#include <array>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "array.hpp"
|
#include "array.hpp"
|
||||||
#include "bit.hpp"
|
#include "bit.hpp"
|
||||||
#include "def.hpp"
|
#include "def.hpp"
|
||||||
#include "iterator.hpp"
|
#include "iterator.hpp"
|
||||||
#include "vector.hpp"
|
#include "vector.hpp"
|
||||||
|
|
||||||
OX_CLANG_NOWARN_BEGIN(-Wunsafe-buffer-usage)
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
|
|
||||||
namespace ox {
|
namespace ox {
|
||||||
|
|
||||||
@ -35,6 +39,20 @@ class Span {
|
|||||||
|
|
||||||
constexpr Span() noexcept = default;
|
constexpr Span() noexcept = default;
|
||||||
|
|
||||||
|
#if __has_include(<array>)
|
||||||
|
template<std::size_t sz>
|
||||||
|
constexpr Span(std::array<T, sz> &a) noexcept:
|
||||||
|
m_items(a.data()),
|
||||||
|
m_size(a.size()) {
|
||||||
|
}
|
||||||
|
|
||||||
|
template<std::size_t sz>
|
||||||
|
constexpr Span(std::array<ox::remove_const_t<T>, sz> const&a) noexcept:
|
||||||
|
m_items(a.data()),
|
||||||
|
m_size(a.size()) {
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
template<std::size_t sz>
|
template<std::size_t sz>
|
||||||
constexpr Span(ox::Array<T, sz> &a) noexcept:
|
constexpr Span(ox::Array<T, sz> &a) noexcept:
|
||||||
m_items(a.data()),
|
m_items(a.data()),
|
||||||
@ -129,22 +147,22 @@ class Span {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constexpr T &operator[](std::size_t i) noexcept {
|
constexpr T &operator[](std::size_t i) noexcept {
|
||||||
ox::primitiveAssert(__FILE__, __LINE__, i < size(), "Span access overflow");
|
boundsCheck(__FILE__, __LINE__, i, size(), "Span access overflow");
|
||||||
return m_items[i];
|
return m_items[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr const T &operator[](std::size_t i) const noexcept {
|
constexpr T const&operator[](std::size_t i) const noexcept {
|
||||||
ox::primitiveAssert(__FILE__, __LINE__, i < size(), "Span access overflow");
|
boundsCheck(__FILE__, __LINE__, i, size(), "Span access overflow");
|
||||||
return m_items[i];
|
return m_items[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr Span operator+(size_t i) const noexcept {
|
constexpr Span operator+(size_t i) const noexcept {
|
||||||
ox::primitiveAssert(__FILE__, __LINE__, i < size(), "Span access overflow");
|
boundsCheck(__FILE__, __LINE__, i, size(), "Span access overflow");
|
||||||
return {m_items + i, m_size - i};
|
return {m_items + i, m_size - i};
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr Span operator+=(size_t i) noexcept {
|
constexpr Span operator+=(size_t i) noexcept {
|
||||||
ox::primitiveAssert(__FILE__, __LINE__, i < size(), "Span access overflow");
|
boundsCheck(__FILE__, __LINE__, i, size(), "Span access overflow");
|
||||||
m_items += i;
|
m_items += i;
|
||||||
m_size -= i;
|
m_size -= i;
|
||||||
return *this;
|
return *this;
|
||||||
@ -168,8 +186,20 @@ class Span {
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
using SpanView = Span<const T>;
|
using SpanView = Span<T const>;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
constexpr void spancpy(ox::Span<T> const dst, ox::SpanView<T> const src) noexcept {
|
||||||
|
auto const sz = ox::min(dst.size(), src.size());
|
||||||
|
if (std::is_constant_evaluated() || std::is_trivially_copyable_v<T>) {
|
||||||
|
for (size_t i{}; i < sz; ++i) {
|
||||||
|
dst.data()[i] = src.data()[i];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
memcpy(dst.data(), src.data(), sz * sizeof(T));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
OX_CLANG_NOWARN_END
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
|
30
deps/ox/src/ox/std/string.hpp
vendored
30
deps/ox/src/ox/std/string.hpp
vendored
@ -28,7 +28,7 @@ OX_CLANG_NOWARN_BEGIN(-Wunsafe-buffer-usage)
|
|||||||
namespace ox {
|
namespace ox {
|
||||||
|
|
||||||
template<typename Integer>
|
template<typename Integer>
|
||||||
constexpr ox::IString<21> itoa(Integer v) noexcept;
|
constexpr ox::IString<21> intToStr(Integer v) noexcept;
|
||||||
|
|
||||||
template<std::size_t SmallStringSize_v>
|
template<std::size_t SmallStringSize_v>
|
||||||
class BasicString {
|
class BasicString {
|
||||||
@ -171,7 +171,7 @@ class BasicString {
|
|||||||
|
|
||||||
constexpr bool operator>=(BasicString const&other) const noexcept;
|
constexpr bool operator>=(BasicString const&other) const noexcept;
|
||||||
|
|
||||||
constexpr char operator[](std::size_t i) const noexcept;
|
constexpr char const&operator[](std::size_t i) const noexcept;
|
||||||
|
|
||||||
constexpr char &operator[](std::size_t i) noexcept;
|
constexpr char &operator[](std::size_t i) noexcept;
|
||||||
|
|
||||||
@ -213,22 +213,22 @@ class BasicString {
|
|||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr const char *c_str() const noexcept {
|
constexpr const char *c_str() const noexcept {
|
||||||
return static_cast<const char*>(m_buff.data());
|
return m_buff.data();
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
inline explicit operator const char*() const {
|
constexpr explicit operator const char*() const {
|
||||||
return c_str();
|
return c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __has_include(<string>)
|
#if __has_include(<string>)
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
inline std::string toStdString() const {
|
std::string toStdString() const {
|
||||||
return c_str();
|
return c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
inline explicit operator std::string() const {
|
explicit operator std::string() const {
|
||||||
return c_str();
|
return c_str();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -317,13 +317,13 @@ constexpr BasicString<SmallStringSize_v> &BasicString<SmallStringSize_v>::operat
|
|||||||
|
|
||||||
template<std::size_t SmallStringSize_v>
|
template<std::size_t SmallStringSize_v>
|
||||||
constexpr BasicString<SmallStringSize_v> &BasicString<SmallStringSize_v>::operator=(int64_t i) noexcept {
|
constexpr BasicString<SmallStringSize_v> &BasicString<SmallStringSize_v>::operator=(int64_t i) noexcept {
|
||||||
set(ox::itoa(i));
|
set(ox::intToStr(i));
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<std::size_t SmallStringSize_v>
|
template<std::size_t SmallStringSize_v>
|
||||||
constexpr BasicString<SmallStringSize_v> &BasicString<SmallStringSize_v>::operator=(uint64_t i) noexcept {
|
constexpr BasicString<SmallStringSize_v> &BasicString<SmallStringSize_v>::operator=(uint64_t i) noexcept {
|
||||||
set(ox::itoa(i));
|
set(ox::intToStr(i));
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -371,7 +371,7 @@ constexpr BasicString<SmallStringSize_v> &BasicString<SmallStringSize_v>::operat
|
|||||||
|
|
||||||
template<std::size_t SmallStringSize_v>
|
template<std::size_t SmallStringSize_v>
|
||||||
constexpr BasicString<SmallStringSize_v> &BasicString<SmallStringSize_v>::operator+=(Integer_c auto i) noexcept {
|
constexpr BasicString<SmallStringSize_v> &BasicString<SmallStringSize_v>::operator+=(Integer_c auto i) noexcept {
|
||||||
auto const str = ox::itoa(i);
|
auto const str = ox::intToStr(i);
|
||||||
return this->operator+=(str.c_str());
|
return this->operator+=(str.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -392,7 +392,7 @@ template<std::size_t SmallStringSize_v>
|
|||||||
constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::operator+(const char *str) const noexcept {
|
constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::operator+(const char *str) const noexcept {
|
||||||
const std::size_t strLen = ox::strlen(str);
|
const std::size_t strLen = ox::strlen(str);
|
||||||
const auto currentLen = len();
|
const auto currentLen = len();
|
||||||
BasicString<SmallStringSize_v> cpy(currentLen + strLen);
|
BasicString<SmallStringSize_v> cpy;
|
||||||
cpy.m_buff.resize(m_buff.size() + strLen);
|
cpy.m_buff.resize(m_buff.size() + strLen);
|
||||||
ox::listcpy(&cpy.m_buff[0], m_buff.data(), currentLen);
|
ox::listcpy(&cpy.m_buff[0], m_buff.data(), currentLen);
|
||||||
ox::listcpy(&cpy.m_buff[currentLen], str, strLen);
|
ox::listcpy(&cpy.m_buff[currentLen], str, strLen);
|
||||||
@ -414,7 +414,7 @@ constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::operato
|
|||||||
|
|
||||||
template<std::size_t SmallStringSize_v>
|
template<std::size_t SmallStringSize_v>
|
||||||
constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::operator+(Integer_c auto i) const noexcept {
|
constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::operator+(Integer_c auto i) const noexcept {
|
||||||
auto const str = ox::itoa(i);
|
auto const str = ox::intToStr(i);
|
||||||
return *this + str;
|
return *this + str;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -425,7 +425,8 @@ constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::operato
|
|||||||
BasicString<SmallStringSize_v> cpy(currentLen + strLen);
|
BasicString<SmallStringSize_v> cpy(currentLen + strLen);
|
||||||
cpy.m_buff.resize(m_buff.size() + strLen);
|
cpy.m_buff.resize(m_buff.size() + strLen);
|
||||||
ox::listcpy(&cpy.m_buff[0], m_buff.data(), currentLen);
|
ox::listcpy(&cpy.m_buff[0], m_buff.data(), currentLen);
|
||||||
ox::listcpy(&cpy.m_buff[currentLen], src.data(), strLen + 1);
|
ox::listcpy(&cpy.m_buff[currentLen], src.data(), strLen);
|
||||||
|
cpy.m_buff[cpy.m_buff.size() - 1] = 0;
|
||||||
return cpy;
|
return cpy;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -436,7 +437,8 @@ constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::operato
|
|||||||
BasicString<SmallStringSize_v> cpy(currentLen + strLen);
|
BasicString<SmallStringSize_v> cpy(currentLen + strLen);
|
||||||
cpy.m_buff.resize(m_buff.size() + strLen);
|
cpy.m_buff.resize(m_buff.size() + strLen);
|
||||||
ox::listcpy(&cpy.m_buff[0], m_buff.data(), currentLen);
|
ox::listcpy(&cpy.m_buff[0], m_buff.data(), currentLen);
|
||||||
ox::listcpy(&cpy.m_buff[currentLen], src.data(), strLen + 1);
|
ox::listcpy(&cpy.m_buff[currentLen], src.data(), strLen);
|
||||||
|
cpy.m_buff[cpy.m_buff.size() - 1] = 0;
|
||||||
return cpy;
|
return cpy;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -488,7 +490,7 @@ constexpr bool BasicString<SmallStringSize_v>::operator>=(BasicString const&othe
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<std::size_t SmallStringSize_v>
|
template<std::size_t SmallStringSize_v>
|
||||||
constexpr char BasicString<SmallStringSize_v>::operator[](std::size_t i) const noexcept {
|
constexpr char const&BasicString<SmallStringSize_v>::operator[](std::size_t i) const noexcept {
|
||||||
return m_buff[i];
|
return m_buff[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
deps/ox/src/ox/std/stringliteral.hpp
vendored
2
deps/ox/src/ox/std/stringliteral.hpp
vendored
@ -32,7 +32,9 @@ class StringLiteral: public detail::BaseStringView {
|
|||||||
|
|
||||||
constexpr explicit StringLiteral(const char *str, std::size_t len) noexcept: BaseStringView(str, len) {}
|
constexpr explicit StringLiteral(const char *str, std::size_t len) noexcept: BaseStringView(str, len) {}
|
||||||
|
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
constexpr explicit StringLiteral(char const *str) noexcept: StringLiteral(str, ox::strlen(str)) {}
|
constexpr explicit StringLiteral(char const *str) noexcept: StringLiteral(str, ox::strlen(str)) {}
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
|
|
||||||
constexpr StringLiteral &operator=(StringLiteral const&other) noexcept {
|
constexpr StringLiteral &operator=(StringLiteral const&other) noexcept {
|
||||||
if (&other != this) {
|
if (&other != this) {
|
||||||
|
4
deps/ox/src/ox/std/stringview.hpp
vendored
4
deps/ox/src/ox/std/stringview.hpp
vendored
@ -100,7 +100,8 @@ constexpr auto toStdStringView(StringViewCR sv) noexcept {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
constexpr ox::Result<int> atoi(ox::StringViewCR str) noexcept {
|
constexpr ox::Result<int> strToInt(ox::StringViewCR str) noexcept {
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
int total = 0;
|
int total = 0;
|
||||||
int multiplier = 1;
|
int multiplier = 1;
|
||||||
for (auto i = static_cast<int64_t>(str.len()) - 1; i != -1; --i) {
|
for (auto i = static_cast<int64_t>(str.len()) - 1; i != -1; --i) {
|
||||||
@ -113,6 +114,7 @@ constexpr ox::Result<int> atoi(ox::StringViewCR str) noexcept {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return total;
|
return total;
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
4
deps/ox/src/ox/std/strops.cpp
vendored
4
deps/ox/src/ox/std/strops.cpp
vendored
@ -9,6 +9,8 @@
|
|||||||
#include "def.hpp"
|
#include "def.hpp"
|
||||||
#include "strops.hpp"
|
#include "strops.hpp"
|
||||||
|
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
|
|
||||||
static_assert(ox::strcmp("asdf", "hijk") < 0, "asdf < hijk");
|
static_assert(ox::strcmp("asdf", "hijk") < 0, "asdf < hijk");
|
||||||
static_assert(ox::strcmp("hijk", "asdf") > 0, "hijk > asdf");
|
static_assert(ox::strcmp("hijk", "asdf") > 0, "hijk > asdf");
|
||||||
static_assert(ox::strcmp("resize", "read") > 0, "resize > read");
|
static_assert(ox::strcmp("resize", "read") > 0, "resize > read");
|
||||||
@ -42,3 +44,5 @@ std::size_t strlen(const char *str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
2
deps/ox/src/ox/std/test/CMakeLists.txt
vendored
2
deps/ox/src/ox/std/test/CMakeLists.txt
vendored
@ -17,6 +17,8 @@ add_test("[ox/std] String" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "String")
|
|||||||
add_test("[ox/std] SmallMap" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "SmallMap")
|
add_test("[ox/std] SmallMap" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "SmallMap")
|
||||||
add_test("[ox/std] SmallMap2" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "SmallMap2")
|
add_test("[ox/std] SmallMap2" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "SmallMap2")
|
||||||
add_test("[ox/std] Vector" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "Vector")
|
add_test("[ox/std] Vector" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "Vector")
|
||||||
|
add_test("[ox/std] Vector::shrink_to_fit" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "Vector::shrink_to_fit")
|
||||||
|
add_test("[ox/std] findIdx" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "findIdx")
|
||||||
add_test("[ox/std] HashMap" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "HashMap")
|
add_test("[ox/std] HashMap" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "HashMap")
|
||||||
add_test("[ox/std] HeapMgr" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest malloc)
|
add_test("[ox/std] HeapMgr" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest malloc)
|
||||||
add_test("[ox/std] Serialize-Int" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "Serialize-Int")
|
add_test("[ox/std] Serialize-Int" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "Serialize-Int")
|
||||||
|
69
deps/ox/src/ox/std/test/tests.cpp
vendored
69
deps/ox/src/ox/std/test/tests.cpp
vendored
@ -145,6 +145,7 @@ OX_CLANG_NOWARN_END
|
|||||||
return ox::Error{};
|
return ox::Error{};
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
{
|
{
|
||||||
"ABCDEFG != HIJKLMN",
|
"ABCDEFG != HIJKLMN",
|
||||||
[]() {
|
[]() {
|
||||||
@ -169,6 +170,7 @@ OX_CLANG_NOWARN_END
|
|||||||
return ox::Error(ox::memcmp("ABCDEFGHI", "ABCDEFG", 7) != 0);
|
return ox::Error(ox::memcmp("ABCDEFGHI", "ABCDEFG", 7) != 0);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
{
|
{
|
||||||
"IString",
|
"IString",
|
||||||
[]() {
|
[]() {
|
||||||
@ -237,6 +239,50 @@ OX_CLANG_NOWARN_END
|
|||||||
return ox::Error(0);
|
return ox::Error(0);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"Vector::shrink_to_fit",
|
||||||
|
[] {
|
||||||
|
{
|
||||||
|
ox::Vector<ox::IString<8>> v;
|
||||||
|
v.reserve(50);
|
||||||
|
v.emplace_back("asdf");
|
||||||
|
v.emplace_back("aoeu");
|
||||||
|
auto const origData = v.data();
|
||||||
|
v.shrink_to_fit();
|
||||||
|
oxExpect(v[0], "asdf");
|
||||||
|
oxExpect(v[1], "aoeu");
|
||||||
|
oxExpect(v.capacity(), 2u);
|
||||||
|
oxAssert(origData != v.data(), "shrink_to_fit did not create a new allocation");
|
||||||
|
}
|
||||||
|
{
|
||||||
|
ox::Vector<ox::IString<8>> v;
|
||||||
|
v.reserve(2);
|
||||||
|
v.emplace_back("asdf");
|
||||||
|
v.emplace_back("aoeu");
|
||||||
|
auto const origData = v.data();
|
||||||
|
v.shrink_to_fit();
|
||||||
|
oxExpect(v[0], "asdf");
|
||||||
|
oxExpect(v[1], "aoeu");
|
||||||
|
oxExpect(v.capacity(), 2u);
|
||||||
|
oxAssert(origData == v.data(), "shrink_to_fit inappropriately created a new allocation");
|
||||||
|
}
|
||||||
|
return ox::Error{};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"findIdx",
|
||||||
|
[] {
|
||||||
|
ox::Vector<ox::IString<8>> const v {"zero", "one", "two", "three", "four"};
|
||||||
|
oxExpect(ox::findIdx(v.begin(), v.end(), "zero").or_value(5), 0u);
|
||||||
|
oxExpect(ox::findIdx(v.begin(), v.end(), "one").or_value(5), 1u);
|
||||||
|
oxExpect(ox::findIdx(v.begin(), v.end(), "two").or_value(5), 2u);
|
||||||
|
oxExpect(ox::findIdx(v.begin(), v.end(), "three").or_value(5), 3u);
|
||||||
|
oxExpect(ox::findIdx(v.begin(), v.end(), "four").or_value(5), 4u);
|
||||||
|
oxExpect(ox::findIdx(v.begin(), v.end(), "five").or_value(5), 5u);
|
||||||
|
oxExpect(ox::findIdx(v.begin(), v.end(), "six").or_value(6), 6u);
|
||||||
|
return ox::Error{};
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"SmallMap",
|
"SmallMap",
|
||||||
[] {
|
[] {
|
||||||
@ -246,7 +292,18 @@ OX_CLANG_NOWARN_END
|
|||||||
oxExpect(map.size(), 1u);
|
oxExpect(map.size(), 1u);
|
||||||
oxExpect(map["aoeu"], "");
|
oxExpect(map["aoeu"], "");
|
||||||
oxExpect(map.size(), 2u);
|
oxExpect(map.size(), 2u);
|
||||||
return ox::Error(0);
|
ox::SmallMap<ox::String, ox::String> cmap;
|
||||||
|
cmap["asdf"] = "aoeu";
|
||||||
|
auto constexpr constTest = [](ox::SmallMap<ox::String, ox::String> const&map) {
|
||||||
|
OX_REQUIRE(asdf, map.at("asdf"));
|
||||||
|
oxExpect(*asdf, "aoeu");
|
||||||
|
oxExpect(map.size(), 1u);
|
||||||
|
auto const aoeu = map.at("aoeu");
|
||||||
|
oxExpect(aoeu.ok(), false);
|
||||||
|
oxExpect(map.size(), 1u);
|
||||||
|
return ox::Error{};
|
||||||
|
};
|
||||||
|
return constTest(cmap);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -273,6 +330,16 @@ OX_CLANG_NOWARN_END
|
|||||||
si["aoeu"] = 100;
|
si["aoeu"] = 100;
|
||||||
oxAssert(si["asdf"] == 42, "asdf != 42");
|
oxAssert(si["asdf"] == 42, "asdf != 42");
|
||||||
oxAssert(si["aoeu"] == 100, "aoeu != 100");
|
oxAssert(si["aoeu"] == 100, "aoeu != 100");
|
||||||
|
si.erase("asdf");
|
||||||
|
oxAssert(!si.contains("asdf"), "wrongly contains asdf");
|
||||||
|
oxAssert(si.contains("aoeu"), "does not contains aoeu");
|
||||||
|
oxAssert(!si.at("asdf").ok(), "asdf != 0");
|
||||||
|
oxExpect(si["asdf"], 0);
|
||||||
|
oxAssert(si["aoeu"] == 100, "aoeu != 100");
|
||||||
|
auto si2 = si;
|
||||||
|
oxDebugf("{}", si2["asdf"]);
|
||||||
|
oxExpect(si2["asdf"], 0);
|
||||||
|
oxAssert(si2["aoeu"] == 100, "aoeu != 100");
|
||||||
ox::HashMap<int, int> ii;
|
ox::HashMap<int, int> ii;
|
||||||
ii[4] = 42;
|
ii[4] = 42;
|
||||||
ii[5] = 100;
|
ii[5] = 100;
|
||||||
|
8
deps/ox/src/ox/std/trace.hpp
vendored
8
deps/ox/src/ox/std/trace.hpp
vendored
@ -269,8 +269,8 @@ using TraceStream = NullStream;
|
|||||||
inline void logError(const char *file, int line, const char *fmt, const Error &err) noexcept {
|
inline void logError(const char *file, int line, const char *fmt, const Error &err) noexcept {
|
||||||
if (err) {
|
if (err) {
|
||||||
TraceStream trc(file, line, "ox::error");
|
TraceStream trc(file, line, "ox::error");
|
||||||
if (err.file != nullptr) {
|
if (err.src.file_name() != nullptr) {
|
||||||
trc << "Error: (" << err.file << ":" << err.line << "):";
|
trc << "Error: (" << err.src.file_name() << ":" << err.src.line() << "):";
|
||||||
} else {
|
} else {
|
||||||
trc << "Error:";
|
trc << "Error:";
|
||||||
}
|
}
|
||||||
@ -282,8 +282,8 @@ inline void logError(const char *file, int line, const Error &err) noexcept {
|
|||||||
if (err) {
|
if (err) {
|
||||||
TraceStream trc(file, line, "ox::error");
|
TraceStream trc(file, line, "ox::error");
|
||||||
trc << "Error:" << err;
|
trc << "Error:" << err;
|
||||||
if (err.file != nullptr) {
|
if (err.src.file_name() != nullptr) {
|
||||||
trc << "(" << err.file << ":" << err.line << ")";
|
trc << "(" << err.src.file_name() << ":" << err.src.line() << ")";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
4
deps/ox/src/ox/std/tracehook.cpp
vendored
4
deps/ox/src/ox/std/tracehook.cpp
vendored
@ -39,6 +39,8 @@ enum LogChan {
|
|||||||
Debug = 4,
|
Debug = 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
|
|
||||||
template<LogChan chan>
|
template<LogChan chan>
|
||||||
static void log(ox::StringViewCR str) {
|
static void log(ox::StringViewCR str) {
|
||||||
const auto sz = ox::min<std::size_t>(0x100, str.bytes());
|
const auto sz = ox::min<std::size_t>(0x100, str.bytes());
|
||||||
@ -103,5 +105,7 @@ void oxTraceHook([[maybe_unused]] const char *file, [[maybe_unused]] int line,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
10
deps/ox/src/ox/std/typetraits.hpp
vendored
10
deps/ox/src/ox/std/typetraits.hpp
vendored
@ -19,12 +19,15 @@
|
|||||||
namespace std {
|
namespace std {
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr bool is_union_v = __is_union(T);
|
inline constexpr bool is_union_v = __is_union(T);
|
||||||
|
|
||||||
constexpr bool is_constant_evaluated() noexcept {
|
inline constexpr bool is_constant_evaluated() noexcept {
|
||||||
return __builtin_is_constant_evaluated();
|
return __builtin_is_constant_evaluated();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline constexpr bool is_trivially_copyable_v = __is_trivially_copyable(T);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@ -156,6 +159,9 @@ static_assert(is_class<int>::value == false);
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr bool is_class_v = is_class<T>();
|
constexpr bool is_class_v = is_class<T>();
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline constexpr bool is_trivially_copyable_v = std::is_trivially_copyable_v<T>;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr bool is_signed_v = integral_constant<bool, T(-1) < T(0)>::value;
|
constexpr bool is_signed_v = integral_constant<bool, T(-1) < T(0)>::value;
|
||||||
|
|
||||||
|
42
deps/ox/src/ox/std/utility.hpp
vendored
42
deps/ox/src/ox/std/utility.hpp
vendored
@ -27,6 +27,48 @@ constexpr void swap(T &a, T &b) noexcept {
|
|||||||
b = std::move(temp);
|
b = std::move(temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T, typename U>
|
||||||
|
constexpr bool cmp_equal(T const t, U const u) noexcept {
|
||||||
|
if constexpr(ox::is_signed_v<T> == ox::is_signed_v<U>) {
|
||||||
|
return t == u;
|
||||||
|
} else if constexpr(ox::is_signed_v<T>) {
|
||||||
|
return ox::Signed<T>{t} == u;
|
||||||
|
} else {
|
||||||
|
return t == ox::Signed<U>{u};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T, typename U>
|
||||||
|
constexpr bool cmp_less(T const t, U const u) noexcept {
|
||||||
|
if constexpr(ox::is_signed_v<T> == ox::is_signed_v<U>) {
|
||||||
|
return t < u;
|
||||||
|
} else if constexpr(ox::is_signed_v<T>) {
|
||||||
|
return ox::Signed<T>{t} < u;
|
||||||
|
} else {
|
||||||
|
return t < ox::Signed<U>{u};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T, typename U>
|
||||||
|
constexpr bool cmp_not_equal(T const t, U const u) noexcept {
|
||||||
|
return !std::cmp_equal(t, u);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T, typename U>
|
||||||
|
constexpr bool cmp_greater(T const t, U const u) noexcept {
|
||||||
|
return std::cmp_less(u, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T, typename U>
|
||||||
|
constexpr bool cmp_less_equal(T const t, U const u) noexcept {
|
||||||
|
return !std::cmp_less(u, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T, typename U>
|
||||||
|
constexpr bool cmp_greater_equal(T const t, U const u) noexcept {
|
||||||
|
return !std::cmp_less(t, u);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
4
deps/ox/src/ox/std/uuid.hpp
vendored
4
deps/ox/src/ox/std/uuid.hpp
vendored
@ -105,6 +105,10 @@ class UUID {
|
|||||||
ox::Array<uint8_t, 16> m_value{};
|
ox::Array<uint8_t, 16> m_value{};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
static constexpr auto TypeName = "net.drinkingtea.ox.UUID";
|
||||||
|
static constexpr auto TypeVersion = 1;
|
||||||
|
|
||||||
static void seedGenerator(const RandomSeed &seed) noexcept;
|
static void seedGenerator(const RandomSeed &seed) noexcept;
|
||||||
|
|
||||||
static ox::Result<UUID> generate() noexcept;
|
static ox::Result<UUID> generate() noexcept;
|
||||||
|
38
deps/ox/src/ox/std/vector.hpp
vendored
38
deps/ox/src/ox/std/vector.hpp
vendored
@ -311,8 +311,12 @@ class Vector: detail::VectorAllocator<T, Allocator, SmallVectorSize> {
|
|||||||
*/
|
*/
|
||||||
constexpr Error unordered_erase(std::size_t pos) noexcept(useNoexcept);
|
constexpr Error unordered_erase(std::size_t pos) noexcept(useNoexcept);
|
||||||
|
|
||||||
|
constexpr Error remove(T const &val);
|
||||||
|
|
||||||
constexpr void reserve(std::size_t cap) noexcept(useNoexcept);
|
constexpr void reserve(std::size_t cap) noexcept(useNoexcept);
|
||||||
|
|
||||||
|
constexpr void shrink_to_fit() noexcept(useNoexcept);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
constexpr void reserveInsert(
|
constexpr void reserveInsert(
|
||||||
std::size_t cap, std::size_t pos, std::size_t offset = 1) noexcept(useNoexcept);
|
std::size_t cap, std::size_t pos, std::size_t offset = 1) noexcept(useNoexcept);
|
||||||
@ -341,6 +345,7 @@ constexpr Vector<T, SmallVectorSize, Allocator>::Vector(std::size_t size) noexce
|
|||||||
|
|
||||||
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
||||||
constexpr Vector<T, SmallVectorSize, Allocator>::Vector(std::initializer_list<T> list) noexcept {
|
constexpr Vector<T, SmallVectorSize, Allocator>::Vector(std::initializer_list<T> list) noexcept {
|
||||||
|
reserve(list.size());
|
||||||
for (auto &item : list) {
|
for (auto &item : list) {
|
||||||
emplace_back(std::move(item));
|
emplace_back(std::move(item));
|
||||||
}
|
}
|
||||||
@ -424,13 +429,13 @@ constexpr Vector<T, SmallVectorSize, Allocator> &Vector<T, SmallVectorSize, Allo
|
|||||||
|
|
||||||
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
||||||
constexpr T &Vector<T, SmallVectorSize, Allocator>::operator[](std::size_t i) noexcept {
|
constexpr T &Vector<T, SmallVectorSize, Allocator>::operator[](std::size_t i) noexcept {
|
||||||
ox::primitiveAssert(__FILE__, __LINE__, i < size(), "Vector access overflow");
|
boundsCheck(__FILE__, __LINE__, i, size(), "Vector access overflow");
|
||||||
return m_items[i];
|
return m_items[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
||||||
constexpr const T &Vector<T, SmallVectorSize, Allocator>::operator[](std::size_t i) const noexcept {
|
constexpr const T &Vector<T, SmallVectorSize, Allocator>::operator[](std::size_t i) const noexcept {
|
||||||
ox::primitiveAssert(__FILE__, __LINE__, i < size(), "Vector access overflow");
|
boundsCheck(__FILE__, __LINE__, i, size(), "Vector access overflow");
|
||||||
return m_items[i];
|
return m_items[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -656,6 +661,17 @@ constexpr Error Vector<T, SmallVectorSize, Allocator>::unordered_erase(std::size
|
|||||||
return ox::Error(0);
|
return ox::Error(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
||||||
|
constexpr ox::Error Vector<T, SmallVectorSize, Allocator>::remove(T const &val) {
|
||||||
|
for (size_t i{}; auto const &v : *this) {
|
||||||
|
if (v == val) {
|
||||||
|
return erase(i).error;
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
return ox::Error{1, "element not found"};
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
||||||
constexpr void Vector<T, SmallVectorSize, Allocator>::reserve(std::size_t cap) noexcept(useNoexcept) {
|
constexpr void Vector<T, SmallVectorSize, Allocator>::reserve(std::size_t cap) noexcept(useNoexcept) {
|
||||||
if (cap <= m_cap) {
|
if (cap <= m_cap) {
|
||||||
@ -675,6 +691,24 @@ constexpr void Vector<T, SmallVectorSize, Allocator>::reserve(std::size_t cap) n
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
||||||
|
constexpr void Vector<T, SmallVectorSize, Allocator>::shrink_to_fit() noexcept(useNoexcept) {
|
||||||
|
if (m_size == m_cap) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const auto oldItems = m_items;
|
||||||
|
const auto oldCap = m_cap;
|
||||||
|
m_cap = m_size;
|
||||||
|
this->allocate(&m_items, m_size);
|
||||||
|
if (oldItems) { // move over old items
|
||||||
|
for (std::size_t i = 0; i < m_size; ++i) {
|
||||||
|
std::construct_at(&m_items[i], std::move(oldItems[i]));
|
||||||
|
oldItems[i].~T();
|
||||||
|
}
|
||||||
|
this->deallocate(oldItems, oldCap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
||||||
constexpr void Vector<T, SmallVectorSize, Allocator>::reserveInsert(
|
constexpr void Vector<T, SmallVectorSize, Allocator>::reserveInsert(
|
||||||
std::size_t cap,
|
std::size_t cap,
|
||||||
|
21
deps/teagba/src/cstartup.cpp
vendored
21
deps/teagba/src/cstartup.cpp
vendored
@ -4,17 +4,20 @@
|
|||||||
|
|
||||||
#include <ox/std/heapmgr.hpp>
|
#include <ox/std/heapmgr.hpp>
|
||||||
|
|
||||||
|
#include <teagba/bios.hpp>
|
||||||
|
#include <teagba/registers.hpp>
|
||||||
|
|
||||||
namespace mgba {
|
namespace mgba {
|
||||||
void initConsole();
|
void initConsole();
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MEM_EWRAM_BEGIN reinterpret_cast<char*>(0x02000000)
|
#define MEM_HEAP_BEGIN reinterpret_cast<char*>(0x02000000)
|
||||||
#define MEM_EWRAM_END reinterpret_cast<char*>(0x0203FFFF)
|
#define MEM_HEAP_END reinterpret_cast<char*>(0x0203FFFF)
|
||||||
|
|
||||||
#define HEAP_BEGIN reinterpret_cast<char*>(MEM_EWRAM_BEGIN)
|
#define HEAP_BEGIN reinterpret_cast<char*>(MEM_HEAP_BEGIN)
|
||||||
// set size to half of EWRAM
|
// set size to half of EWRAM
|
||||||
#define HEAP_SIZE ((MEM_EWRAM_END - MEM_EWRAM_BEGIN) / 2)
|
#define HEAP_SIZE ((MEM_HEAP_END - MEM_HEAP_BEGIN) / 2)
|
||||||
#define HEAP_END reinterpret_cast<char*>(MEM_EWRAM_BEGIN + HEAP_SIZE)
|
#define HEAP_END reinterpret_cast<char*>(MEM_HEAP_BEGIN + HEAP_SIZE)
|
||||||
|
|
||||||
extern void (*__preinit_array_start[]) (void);
|
extern void (*__preinit_array_start[]) (void);
|
||||||
extern void (*__preinit_array_end[]) (void);
|
extern void (*__preinit_array_end[]) (void);
|
||||||
@ -25,6 +28,14 @@ int main(int argc, const char **argv);
|
|||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
|
void abort() {
|
||||||
|
REG_IE = 0;
|
||||||
|
teagba::intrwait(0, 0);
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *__gxx_personality_v0{};
|
||||||
|
|
||||||
void __libc_init_array() {
|
void __libc_init_array() {
|
||||||
auto preInits = __preinit_array_end - __preinit_array_start;
|
auto preInits = __preinit_array_end - __preinit_array_start;
|
||||||
for (decltype(preInits) i = 0; i < preInits; i++) {
|
for (decltype(preInits) i = 0; i < preInits; i++) {
|
||||||
|
@ -162,11 +162,9 @@ The Ox way of doing things is the Olympic way of doing things.
|
|||||||
|
|
||||||
### Error Handling
|
### Error Handling
|
||||||
|
|
||||||
The GBA build has exceptions disabled.
|
Instead of throwing exceptions, generally try to use
|
||||||
Instead of throwing exceptions, all engine code should return
|
[ox::Errors](deps/ox/ox-docs.md#error-handling) for error reporting,
|
||||||
[ox::Errors](deps/ox/ox-docs.md#error-handling) for error reporting.
|
but exceptions may be used where they make sense.
|
||||||
For the sake of consistency, try to stick to ```ox::Error``` in non-engine code
|
|
||||||
as well, but non-engine code is free to use exceptions when they make sense.
|
|
||||||
|
|
||||||
Exceptions should generally just use ```OxException```, which is bascially an
|
Exceptions should generally just use ```OxException```, which is bascially an
|
||||||
exception form of ```ox::Error```.
|
exception form of ```ox::Error```.
|
||||||
|
51
release-notes.md
Normal file
51
release-notes.md
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
# d2025.05.1
|
||||||
|
|
||||||
|
* TileSheetEditor: Fix overrun errors when switching subsheets, clear selection
|
||||||
|
on switch (261e324acd)
|
||||||
|
* Fix new build error that occurs in MSVC (26d5048e6720c4c2d52508a6ee44c67dd9fe3ee5)
|
||||||
|
|
||||||
|
# d2025.05.0
|
||||||
|
|
||||||
|
* Add app icon for both window and file
|
||||||
|
* Change application font to Roboto Medium
|
||||||
|
* Closing application will now confirm with user if any files have unsaved
|
||||||
|
changes.
|
||||||
|
* UUID duplicates will now be reported when opening a project
|
||||||
|
* Deleting a directory now closes files in that directory
|
||||||
|
* Delete key now initiates deletion of selected directory
|
||||||
|
* Remove ability to re-order tabs. There were bugs associated with that.
|
||||||
|
* TileSheetEditor: Fix selection clearing in to work when clicking outside
|
||||||
|
image.
|
||||||
|
* TileSheetEditor: Fix Delete Tile functionality, which was completely broken
|
||||||
|
* PaletteEditor: Fix color number key range in. Previously, pressing A caused
|
||||||
|
the editor to jump to the last color.
|
||||||
|
* PaletteEditor: page rename will now take effect upon pressing enter if the
|
||||||
|
text input has focus
|
||||||
|
|
||||||
|
# d2025.02.1
|
||||||
|
|
||||||
|
* Fix closing tab with unsaved changes (a44c5acc4b)
|
||||||
|
|
||||||
|
# d2025.02.0
|
||||||
|
|
||||||
|
* Rename core namespace to gfx.
|
||||||
|
* Add PaletteV5 to accommodate namespace change.
|
||||||
|
* Add TileSheetV5. TileSheetV5 retains the bpp field for the sake of
|
||||||
|
CompactTileSheet, but always store it pixel as 8 bpp for itself.
|
||||||
|
* Add ability to move subsheets in the subsheet tree.
|
||||||
|
* Add Flip X and Flip Y functionality to TileSheet Editor.
|
||||||
|
* Add rotate functionality to TileSheet Editor.
|
||||||
|
* Add draw line tool to TileSheet editor
|
||||||
|
* Replace file picker combo boxes with a browse button and file picker, and
|
||||||
|
support for dragging files from the project explorer.
|
||||||
|
* Add ability to jump to a color in a Palette by double clicking on the
|
||||||
|
color from the TileSheet editor
|
||||||
|
* Add ability to create directories.
|
||||||
|
* Add ability to add files to specific directories.
|
||||||
|
* Add ability to delete files from the project explorer.
|
||||||
|
* Ctrl-<num key> keyboard shortcuts for jumping between tabs.
|
||||||
|
* Fix Palette Editor to ignore keyboard input when popups are open.
|
||||||
|
* Palette Editor move color mechanism now uses drag and drop.
|
||||||
|
* Add ability to reorder Palette pages.
|
||||||
|
* Add warning for closing a tab with unsaved changes.
|
||||||
|
* Add ability to close a tab with Ctrl/Cmd-W
|
@ -0,0 +1,23 @@
|
|||||||
|
O1;net.drinkingtea.ox.TypeDescriptor;1;{
|
||||||
|
"fieldList" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"fieldName" : "pages",
|
||||||
|
"subscriptLevels" : 2,
|
||||||
|
"subscriptStack" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"subscriptType" : 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subscriptType" : 4
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"typeId" : "B.uint16;0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"preloadable" : true,
|
||||||
|
"primitiveType" : 5,
|
||||||
|
"typeName" : "net.drinkingtea.nostalgia.gfx.CompactPalette",
|
||||||
|
"typeVersion" : 1
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
O1;net.drinkingtea.ox.TypeDescriptor;1;{
|
||||||
|
"fieldList" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"fieldName" : "bpp",
|
||||||
|
"typeId" : "B.int8;0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldName" : "defaultPalette",
|
||||||
|
"typeId" : "net.drinkingtea.ox.FileAddress;1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldName" : "pixels",
|
||||||
|
"subscriptLevels" : 1,
|
||||||
|
"subscriptStack" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"subscriptType" : 4
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"typeId" : "B.uint8;0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"preloadable" : true,
|
||||||
|
"primitiveType" : 5,
|
||||||
|
"typeName" : "net.drinkingtea.nostalgia.gfx.CompactTileSheet",
|
||||||
|
"typeVersion" : 1
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
O1;net.drinkingtea.ox.TypeDescriptor;1;{
|
||||||
|
"fieldList" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"fieldName" : "name",
|
||||||
|
"typeId" : "net.drinkingtea.ox.BasicString#8#;1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldName" : "colors",
|
||||||
|
"subscriptLevels" : 1,
|
||||||
|
"subscriptStack" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"subscriptType" : 4
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"typeId" : "net.drinkingtea.nostalgia.gfx.PaletteColor;2"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"primitiveType" : 5,
|
||||||
|
"typeName" : "net.drinkingtea.nostalgia.gfx.Palette.PalettePage",
|
||||||
|
"typeVersion" : 2
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
O1;net.drinkingtea.ox.TypeDescriptor;1;{
|
||||||
|
"fieldList" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"fieldName" : "colorNames",
|
||||||
|
"subscriptLevels" : 1,
|
||||||
|
"subscriptStack" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"subscriptType" : 4
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"typeId" : "net.drinkingtea.ox.BasicString#8#;1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldName" : "pages",
|
||||||
|
"subscriptLevels" : 1,
|
||||||
|
"subscriptStack" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"subscriptType" : 4
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"typeId" : "net.drinkingtea.nostalgia.gfx.Palette.PalettePage;2"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"preloadable" : true,
|
||||||
|
"primitiveType" : 5,
|
||||||
|
"typeName" : "net.drinkingtea.nostalgia.gfx.Palette",
|
||||||
|
"typeVersion" : 5
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
O1;net.drinkingtea.ox.TypeDescriptor;1;{
|
||||||
|
"fieldList" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"fieldName" : "r",
|
||||||
|
"typeId" : "B.uint8;0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldName" : "g",
|
||||||
|
"typeId" : "B.uint8;0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldName" : "b",
|
||||||
|
"typeId" : "B.uint8;0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldName" : "a",
|
||||||
|
"typeId" : "B.uint8;0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"primitiveType" : 5,
|
||||||
|
"typeName" : "net.drinkingtea.nostalgia.gfx.PaletteColor",
|
||||||
|
"typeVersion" : 2
|
||||||
|
}
|
@ -0,0 +1,46 @@
|
|||||||
|
O1;net.drinkingtea.ox.TypeDescriptor;1;{
|
||||||
|
"fieldList" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"fieldName" : "id",
|
||||||
|
"typeId" : "B.int32;0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldName" : "name",
|
||||||
|
"typeId" : "net.drinkingtea.ox.BasicString#8#;1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldName" : "rows",
|
||||||
|
"typeId" : "B.int32;0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldName" : "columns",
|
||||||
|
"typeId" : "B.int32;0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldName" : "subsheets",
|
||||||
|
"subscriptLevels" : 1,
|
||||||
|
"subscriptStack" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"subscriptType" : 4
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"typeId" : "net.drinkingtea.nostalgia.gfx.TileSheet.SubSheet;5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldName" : "pixels",
|
||||||
|
"subscriptLevels" : 1,
|
||||||
|
"subscriptStack" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"subscriptType" : 4
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"typeId" : "B.uint8;0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"primitiveType" : 5,
|
||||||
|
"typeName" : "net.drinkingtea.nostalgia.gfx.TileSheet.SubSheet",
|
||||||
|
"typeVersion" : 5
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
O1;net.drinkingtea.ox.TypeDescriptor;1;{
|
||||||
|
"fieldList" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"fieldName" : "bpp",
|
||||||
|
"typeId" : "B.int8;0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldName" : "idIt",
|
||||||
|
"typeId" : "B.int32;0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldName" : "defaultPalette",
|
||||||
|
"typeId" : "net.drinkingtea.ox.BasicString#8#;1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldName" : "subsheet",
|
||||||
|
"typeId" : "net.drinkingtea.nostalgia.gfx.TileSheet.SubSheet;5"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"primitiveType" : 5,
|
||||||
|
"typeName" : "net.drinkingtea.nostalgia.gfx.TileSheet",
|
||||||
|
"typeVersion" : 5
|
||||||
|
}
|
@ -1 +1,28 @@
|
|||||||
K1;0f75977f-1c52-45f8-9793-52ea2dc200a0;M2;net.drinkingtea.nostalgia.core.Palette;1;<03><><07><>
|
K1;0f75977f-1c52-45f8-9793-52ea2dc200a0;O1;net.drinkingtea.nostalgia.gfx.Palette;5;{
|
||||||
|
"colorNames" :
|
||||||
|
[
|
||||||
|
"Color 1",
|
||||||
|
"Color 2"
|
||||||
|
],
|
||||||
|
"pages" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"colors" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"a" : 1,
|
||||||
|
"b" : 31,
|
||||||
|
"g" : 31,
|
||||||
|
"r" : 31
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"a" : 1,
|
||||||
|
"b" : 22,
|
||||||
|
"g" : 22,
|
||||||
|
"r" : 22
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name" : "Page 1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -1 +1,36 @@
|
|||||||
K1;c79f21e2-f74f-4ad9-90ed-32b0ef7da6ed;M2;net.drinkingtea.nostalgia.core.Palette;1;P<>{<03><>C<>
|
K1;c79f21e2-f74f-4ad9-90ed-32b0ef7da6ed;O1;net.drinkingtea.nostalgia.gfx.Palette;5;{
|
||||||
|
"colorNames" :
|
||||||
|
[
|
||||||
|
"Color 1",
|
||||||
|
"Color 2",
|
||||||
|
"Color 3",
|
||||||
|
"Color 4"
|
||||||
|
],
|
||||||
|
"pages" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"colors" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"b" : 5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"b" : 22,
|
||||||
|
"g" : 22,
|
||||||
|
"r" : 22
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"b" : 27,
|
||||||
|
"g" : 27,
|
||||||
|
"r" : 27
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"b" : 20,
|
||||||
|
"g" : 8,
|
||||||
|
"r" : 8
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name" : "Page 1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
28
sample_project/Palettes/SC9K_Logo.npal
Normal file
28
sample_project/Palettes/SC9K_Logo.npal
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
K1;3d1a77ec-265f-4905-2061-4f1003ee2189;O1;net.drinkingtea.nostalgia.gfx.Palette;5;{
|
||||||
|
"colorNames" :
|
||||||
|
[
|
||||||
|
"Color 1",
|
||||||
|
"Color 2",
|
||||||
|
"Color 3"
|
||||||
|
],
|
||||||
|
"pages" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"colors" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"b" : 10,
|
||||||
|
"g" : 5,
|
||||||
|
"r" : 5
|
||||||
|
},
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
"b" : 31,
|
||||||
|
"g" : 31,
|
||||||
|
"r" : 31
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name" : "Page 1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
Binary file not shown.
Binary file not shown.
352
sample_project/TileSheets/Chester.nts
Normal file
352
sample_project/TileSheets/Chester.nts
Normal file
@ -0,0 +1,352 @@
|
|||||||
|
K1;5667c759-7ba1-470a-8860-72f0720dc58c;O1;net.drinkingtea.nostalgia.gfx.TileSheet;5;{
|
||||||
|
"bpp" : 4,
|
||||||
|
"defaultPalette" : "uuid://14fc3dd8-42ff-4bf9-81f1-a010cc5ac251",
|
||||||
|
"idIt" : 7,
|
||||||
|
"subsheet" :
|
||||||
|
{
|
||||||
|
"columns" : -1,
|
||||||
|
"name" : "Root",
|
||||||
|
"rows" : -1,
|
||||||
|
"subsheets" :
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"columns" : 1,
|
||||||
|
"id" : 5,
|
||||||
|
"name" : "Blank",
|
||||||
|
"pixels" :
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"rows" : 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"columns" : 2,
|
||||||
|
"id" : 6,
|
||||||
|
"name" : "Dirt",
|
||||||
|
"pixels" :
|
||||||
|
[
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"rows" : 2
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
591
sample_project/TileSheets/Logo.nts
Normal file
591
sample_project/TileSheets/Logo.nts
Normal file
@ -0,0 +1,591 @@
|
|||||||
|
K1;896a7d25-9dc2-46a0-b4da-c6923b6da01b;O1;net.drinkingtea.nostalgia.gfx.TileSheet;5;{
|
||||||
|
"bpp" : 4,
|
||||||
|
"defaultPalette" : "uuid://c79f21e2-f74f-4ad9-90ed-32b0ef7da6ed",
|
||||||
|
"idIt" : 2,
|
||||||
|
"subsheet" :
|
||||||
|
{
|
||||||
|
"columns" : 3,
|
||||||
|
"id" : 1,
|
||||||
|
"name" : "Root",
|
||||||
|
"pixels" :
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"rows" : 3
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
591
sample_project/TileSheets/NS_Logo.nts
Normal file
591
sample_project/TileSheets/NS_Logo.nts
Normal file
@ -0,0 +1,591 @@
|
|||||||
|
K1;f551fb8b-0e9f-45fc-8106-b98b7fd18ff5;O1;net.drinkingtea.nostalgia.gfx.TileSheet;5;{
|
||||||
|
"bpp" : 4,
|
||||||
|
"defaultPalette" : "uuid://c79f21e2-f74f-4ad9-90ed-32b0ef7da6ed",
|
||||||
|
"idIt" : 2,
|
||||||
|
"subsheet" :
|
||||||
|
{
|
||||||
|
"columns" : 3,
|
||||||
|
"id" : 1,
|
||||||
|
"name" : "Root",
|
||||||
|
"pixels" :
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
3,
|
||||||
|
3,
|
||||||
|
3,
|
||||||
|
3,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
3,
|
||||||
|
3,
|
||||||
|
3,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
3,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
3,
|
||||||
|
3,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
3,
|
||||||
|
3,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
3,
|
||||||
|
3,
|
||||||
|
3,
|
||||||
|
3,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"rows" : 3
|
||||||
|
}
|
||||||
|
}
|
269
sample_project/TileSheets/NS_Logo16.nts
Normal file
269
sample_project/TileSheets/NS_Logo16.nts
Normal file
@ -0,0 +1,269 @@
|
|||||||
|
K1;e7ae945e-d6c5-4444-5738-be95b4e5937a;O1;net.drinkingtea.nostalgia.gfx.TileSheet;5;{
|
||||||
|
"bpp" : 4,
|
||||||
|
"defaultPalette" : "uuid://c79f21e2-f74f-4ad9-90ed-32b0ef7da6ed",
|
||||||
|
"subsheet" :
|
||||||
|
{
|
||||||
|
"columns" : 2,
|
||||||
|
"name" : "Root",
|
||||||
|
"pixels" :
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
3,
|
||||||
|
3,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
3,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
3,
|
||||||
|
3,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"rows" : 2
|
||||||
|
}
|
||||||
|
}
|
1039
sample_project/TileSheets/NS_Logo32.nts
Normal file
1039
sample_project/TileSheets/NS_Logo32.nts
Normal file
File diff suppressed because it is too large
Load Diff
4111
sample_project/TileSheets/NS_Logo64.nts
Normal file
4111
sample_project/TileSheets/NS_Logo64.nts
Normal file
File diff suppressed because it is too large
Load Diff
269
sample_project/TileSheets/SC9K_Logo.nts
Normal file
269
sample_project/TileSheets/SC9K_Logo.nts
Normal file
@ -0,0 +1,269 @@
|
|||||||
|
K1;40f7b4ac-7f90-409e-80e0-64b59b594a63;O1;net.drinkingtea.nostalgia.gfx.TileSheet;5;{
|
||||||
|
"bpp" : 4,
|
||||||
|
"defaultPalette" : "uuid://3d1a77ec-265f-4905-2061-4f1003ee2189",
|
||||||
|
"subsheet" :
|
||||||
|
{
|
||||||
|
"columns" : 2,
|
||||||
|
"name" : "Root",
|
||||||
|
"pixels" :
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"rows" : 2
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
# module dir list
|
# module dir list
|
||||||
|
|
||||||
add_subdirectory(core)
|
add_subdirectory(gfx)
|
||||||
add_subdirectory(scene)
|
add_subdirectory(sound)
|
||||||
|
|
||||||
# module libraries
|
# module libraries
|
||||||
|
|
||||||
@ -13,8 +13,8 @@ add_library(
|
|||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
NostalgiaKeelModules PUBLIC
|
NostalgiaKeelModules PUBLIC
|
||||||
Keel
|
Keel
|
||||||
NostalgiaCore-Keel
|
NostalgiaGfx-Keel
|
||||||
NostalgiaScene-Keel
|
NostalgiaSound-Keel
|
||||||
)
|
)
|
||||||
install(
|
install(
|
||||||
FILES
|
FILES
|
||||||
@ -32,8 +32,8 @@ if(NOSTALGIA_BUILD_STUDIO)
|
|||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
NostalgiaStudioModules PUBLIC
|
NostalgiaStudioModules PUBLIC
|
||||||
StudioAppLib
|
StudioAppLib
|
||||||
NostalgiaCore-Studio-ImGui
|
NostalgiaGfx-Studio-ImGui
|
||||||
NostalgiaScene-Studio
|
NostalgiaSound-Studio-ImGui
|
||||||
)
|
)
|
||||||
install(
|
install(
|
||||||
FILES
|
FILES
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2016 - 2025 Gary Talent (gary@drinkingtea.net). All rights reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <ox/fs/fs.hpp>
|
|
||||||
#include <ox/model/desctypes.hpp>
|
|
||||||
#include <ox/std/buffer.hpp>
|
|
||||||
#include <ox/std/size.hpp>
|
|
||||||
|
|
||||||
#include <turbine/context.hpp>
|
|
||||||
|
|
||||||
#include "initparams.hpp"
|
|
||||||
|
|
||||||
namespace nostalgia::core {
|
|
||||||
|
|
||||||
class Context;
|
|
||||||
|
|
||||||
struct ContextDeleter {
|
|
||||||
void operator()(Context *p) noexcept;
|
|
||||||
};
|
|
||||||
|
|
||||||
using ContextUPtr = ox::UPtr<Context, ContextDeleter>;
|
|
||||||
|
|
||||||
ox::Result<ContextUPtr> init(turbine::Context &tctx, InitParams const¶ms = {}) noexcept;
|
|
||||||
|
|
||||||
keel::Context &keelCtx(Context &ctx) noexcept;
|
|
||||||
|
|
||||||
turbine::Context &turbineCtx(Context &ctx) noexcept;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,63 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2016 - 2025 Gary Talent (gary@drinkingtea.net). All rights reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <ox/std/def.hpp>
|
|
||||||
|
|
||||||
#include <keel/typeconv.hpp>
|
|
||||||
|
|
||||||
#include <nostalgia/core/context.hpp>
|
|
||||||
#include <nostalgia/core/palette.hpp>
|
|
||||||
#include <nostalgia/core/tilesheet.hpp>
|
|
||||||
|
|
||||||
namespace nostalgia::core {
|
|
||||||
|
|
||||||
// Type converters
|
|
||||||
|
|
||||||
class NostalgiaPaletteToPaletteV1Converter: public keel::Converter<NostalgiaPalette, PaletteV1> {
|
|
||||||
ox::Error convert(keel::Context&, NostalgiaPalette &src, PaletteV1 &dst) const noexcept final;
|
|
||||||
};
|
|
||||||
|
|
||||||
class PaletteV1ToPaletteV2Converter: public keel::Converter<PaletteV1, PaletteV2> {
|
|
||||||
ox::Error convert(keel::Context&, PaletteV1 &src, PaletteV2 &dst) const noexcept final;
|
|
||||||
};
|
|
||||||
|
|
||||||
class PaletteV2ToPaletteV3Converter: public keel::Converter<PaletteV2, PaletteV3> {
|
|
||||||
ox::Error convert(keel::Context&, PaletteV2 &src, PaletteV3 &dst) const noexcept final;
|
|
||||||
};
|
|
||||||
|
|
||||||
class PaletteV3ToPaletteV4Converter: public keel::Converter<PaletteV3, PaletteV4> {
|
|
||||||
ox::Error convert(keel::Context&, PaletteV3 &src, PaletteV4 &dst) const noexcept final;
|
|
||||||
};
|
|
||||||
|
|
||||||
class PaletteToCompactPaletteConverter: public keel::Converter<Palette, CompactPalette> {
|
|
||||||
ox::Error convert(keel::Context&, Palette &src, CompactPalette &dst) const noexcept final;
|
|
||||||
};
|
|
||||||
|
|
||||||
class TileSheetV1ToTileSheetV2Converter: public keel::Converter<TileSheetV1, TileSheetV2> {
|
|
||||||
ox::Error convert(keel::Context&, TileSheetV1 &src, TileSheetV2 &dst) const noexcept final;
|
|
||||||
};
|
|
||||||
|
|
||||||
class TileSheetV2ToTileSheetV3Converter: public keel::Converter<TileSheetV2, TileSheetV3> {
|
|
||||||
static void convertSubsheet(
|
|
||||||
TileSheetV2::SubSheet &src,
|
|
||||||
TileSheetV3::SubSheet &dst,
|
|
||||||
SubSheetId &idIt) noexcept;
|
|
||||||
ox::Error convert(keel::Context&, TileSheetV2 &src, TileSheetV3 &dst) const noexcept final;
|
|
||||||
};
|
|
||||||
|
|
||||||
class TileSheetV3ToTileSheetV4Converter: public keel::Converter<TileSheetV3, TileSheetV4> {
|
|
||||||
static void convertSubsheet(
|
|
||||||
TileSheetV3::SubSheet &src,
|
|
||||||
TileSheetV4::SubSheet &dst,
|
|
||||||
SubSheetId &idIt) noexcept;
|
|
||||||
ox::Error convert(keel::Context&, TileSheetV3 &src, TileSheetV4 &dst) const noexcept final;
|
|
||||||
};
|
|
||||||
|
|
||||||
class TileSheetToCompactTileSheetConverter: public keel::Converter<TileSheet, CompactTileSheet> {
|
|
||||||
ox::Error convert(keel::Context&, TileSheet &src, CompactTileSheet &dst) const noexcept final;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
add_library(NostalgiaCore-Studio)
|
|
||||||
|
|
||||||
add_library(
|
|
||||||
NostalgiaCore-Studio-ImGui
|
|
||||||
studiomodule.cpp
|
|
||||||
tilesheeteditor/tilesheeteditor-imgui.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries(
|
|
||||||
NostalgiaCore-Studio PUBLIC
|
|
||||||
NostalgiaCore
|
|
||||||
Studio
|
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries(
|
|
||||||
NostalgiaCore-Studio-ImGui PUBLIC
|
|
||||||
NostalgiaCore-Studio
|
|
||||||
Studio
|
|
||||||
)
|
|
||||||
|
|
||||||
install(
|
|
||||||
TARGETS
|
|
||||||
NostalgiaCore-Studio-ImGui
|
|
||||||
NostalgiaCore-Studio
|
|
||||||
LIBRARY DESTINATION
|
|
||||||
${NOSTALGIA_DIST_MODULE}
|
|
||||||
)
|
|
||||||
|
|
||||||
add_subdirectory(paletteeditor)
|
|
||||||
add_subdirectory(tilesheeteditor)
|
|
@ -1,13 +0,0 @@
|
|||||||
target_sources(
|
|
||||||
NostalgiaCore-Studio PRIVATE
|
|
||||||
commands/addcolorcommand.cpp
|
|
||||||
commands/applycolorallpagescommand.cpp
|
|
||||||
commands/duplicatepagecommand.cpp
|
|
||||||
commands/movecolorcommand.cpp
|
|
||||||
commands/removecolorcommand.cpp
|
|
||||||
commands/removepagecommand.cpp
|
|
||||||
commands/renamepagecommand.cpp
|
|
||||||
commands/updatecolorcommand.cpp
|
|
||||||
commands/updatecolorinfocommand.cpp
|
|
||||||
paletteeditor-imgui.cpp
|
|
||||||
)
|
|
@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2016 - 2025 Gary Talent (gary@drinkingtea.net). All rights reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <ox/std/memory.hpp>
|
|
||||||
|
|
||||||
#include <studio/studio.hpp>
|
|
||||||
|
|
||||||
#include "paletteeditor/paletteeditor-imgui.hpp"
|
|
||||||
#include "tilesheeteditor/tilesheeteditor-imgui.hpp"
|
|
||||||
|
|
||||||
namespace nostalgia::core {
|
|
||||||
|
|
||||||
static class: public studio::Module {
|
|
||||||
ox::Vector<studio::EditorMaker> editors(studio::StudioContext &ctx) const noexcept final {
|
|
||||||
return {
|
|
||||||
studio::editorMaker<TileSheetEditorImGui>(ctx, FileExt_ng),
|
|
||||||
studio::editorMaker<PaletteEditorImGui>(ctx, FileExt_npal),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
ox::Vector<ox::UPtr<studio::ItemMaker>> itemMakers(studio::StudioContext&) const noexcept final {
|
|
||||||
ox::Vector<ox::UniquePtr<studio::ItemMaker>> out;
|
|
||||||
out.emplace_back(ox::make<studio::ItemMakerT<core::TileSheet>>("Tile Sheet", "TileSheets", FileExt_ng));
|
|
||||||
out.emplace_back(ox::make<studio::ItemMakerT<core::Palette>>("Palette", "Palettes", FileExt_npal));
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
} const mod;
|
|
||||||
|
|
||||||
const studio::Module *studioModule() noexcept {
|
|
||||||
return &mod;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,83 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2016 - 2025 Gary Talent (gary@drinkingtea.net). All rights reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "drawcommand.hpp"
|
|
||||||
|
|
||||||
namespace nostalgia::core {
|
|
||||||
|
|
||||||
DrawCommand::DrawCommand(
|
|
||||||
TileSheet &img,
|
|
||||||
TileSheet::SubSheetIdx subSheetIdx,
|
|
||||||
std::size_t idx,
|
|
||||||
int palIdx) noexcept:
|
|
||||||
m_img(img),
|
|
||||||
m_subSheetIdx(std::move(subSheetIdx)),
|
|
||||||
m_palIdx(palIdx) {
|
|
||||||
auto &subsheet = getSubSheet(m_img, m_subSheetIdx);
|
|
||||||
m_changes.emplace_back(static_cast<uint32_t>(idx), getPixel(subsheet, m_img.bpp, idx));
|
|
||||||
}
|
|
||||||
|
|
||||||
DrawCommand::DrawCommand(
|
|
||||||
TileSheet &img,
|
|
||||||
TileSheet::SubSheetIdx subSheetIdx,
|
|
||||||
ox::Vector<std::size_t> const&idxList,
|
|
||||||
int palIdx) noexcept:
|
|
||||||
m_img(img),
|
|
||||||
m_subSheetIdx(std::move(subSheetIdx)),
|
|
||||||
m_palIdx(palIdx) {
|
|
||||||
auto &subsheet = getSubSheet(m_img, m_subSheetIdx);
|
|
||||||
for (auto const idx : idxList) {
|
|
||||||
m_changes.emplace_back(static_cast<uint32_t>(idx), getPixel(subsheet, m_img.bpp, idx));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DrawCommand::append(std::size_t idx) noexcept {
|
|
||||||
auto &subsheet = getSubSheet(m_img, m_subSheetIdx);
|
|
||||||
if (m_changes.back().value->idx != idx && getPixel(subsheet, m_img.bpp, idx) != m_palIdx) {
|
|
||||||
// duplicate entries are bad
|
|
||||||
auto existing = ox::find_if(m_changes.cbegin(), m_changes.cend(), [idx](auto const&c) {
|
|
||||||
return c.idx == idx;
|
|
||||||
});
|
|
||||||
if (existing == m_changes.cend()) {
|
|
||||||
m_changes.emplace_back(static_cast<uint32_t>(idx), getPixel(subsheet, m_img.bpp, idx));
|
|
||||||
setPixel(subsheet, m_img.bpp, idx, static_cast<uint8_t>(m_palIdx));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DrawCommand::append(ox::Vector<std::size_t> const&idxList) noexcept {
|
|
||||||
auto out = false;
|
|
||||||
for (auto idx : idxList) {
|
|
||||||
out = append(idx) || out;
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
ox::Error DrawCommand::redo() noexcept {
|
|
||||||
auto &subsheet = getSubSheet(m_img, m_subSheetIdx);
|
|
||||||
for (auto const&c : m_changes) {
|
|
||||||
setPixel(subsheet, m_img.bpp, c.idx, static_cast<uint8_t>(m_palIdx));
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
ox::Error DrawCommand::undo() noexcept {
|
|
||||||
auto &subsheet = getSubSheet(m_img, m_subSheetIdx);
|
|
||||||
for (auto const&c : m_changes) {
|
|
||||||
setPixel(subsheet, m_img.bpp, c.idx, static_cast<uint8_t>(c.oldPalIdx));
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
int DrawCommand::commandId() const noexcept {
|
|
||||||
return static_cast<int>(CommandId::Draw);
|
|
||||||
}
|
|
||||||
|
|
||||||
TileSheet::SubSheetIdx const&DrawCommand::subsheetIdx() const noexcept {
|
|
||||||
return m_subSheetIdx;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,323 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2016 - 2025 Gary Talent (gary@drinkingtea.net). All rights reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <ox/claw/read.hpp>
|
|
||||||
#include <ox/std/algorithm.hpp>
|
|
||||||
#include <ox/std/buffer.hpp>
|
|
||||||
#include <ox/std/memory.hpp>
|
|
||||||
|
|
||||||
#include <turbine/clipboard.hpp>
|
|
||||||
#include <keel/media.hpp>
|
|
||||||
|
|
||||||
#include <nostalgia/core/ptidxconv.hpp>
|
|
||||||
|
|
||||||
#include "commands/commands.hpp"
|
|
||||||
#include "commands/addsubsheetcommand.hpp"
|
|
||||||
#include "commands/cutpastecommand.hpp"
|
|
||||||
#include "commands/deletetilescommand.hpp"
|
|
||||||
#include "commands/drawcommand.hpp"
|
|
||||||
#include "commands/inserttilescommand.hpp"
|
|
||||||
#include "commands/palettechangecommand.hpp"
|
|
||||||
#include "commands/rmsubsheetcommand.hpp"
|
|
||||||
#include "commands/updatesubsheetcommand.hpp"
|
|
||||||
#include "tilesheeteditormodel.hpp"
|
|
||||||
|
|
||||||
namespace nostalgia::core {
|
|
||||||
|
|
||||||
Palette const TileSheetEditorModel::s_defaultPalette = {
|
|
||||||
.colorNames = {ox::Vector<ox::String>{{}}},
|
|
||||||
.pages = {{"Page 1", ox::Vector<Color16>(128)}},
|
|
||||||
};
|
|
||||||
|
|
||||||
// delete pixels of all non-leaf nodes
|
|
||||||
static void normalizeSubsheets(TileSheet::SubSheet &ss) noexcept {
|
|
||||||
if (ss.subsheets.empty()) {
|
|
||||||
for (auto &child : ss.subsheets) {
|
|
||||||
normalizeSubsheets(child);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ss.pixels.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TileSheetEditorModel::TileSheetEditorModel(studio::StudioContext &sctx, ox::StringView path, studio::UndoStack &undoStack):
|
|
||||||
m_sctx(sctx),
|
|
||||||
m_tctx(m_sctx.tctx),
|
|
||||||
m_path(path),
|
|
||||||
m_img(*readObj<TileSheet>(keelCtx(m_tctx), m_path).unwrapThrow()),
|
|
||||||
// ignore failure to load palette
|
|
||||||
m_pal(readObj<Palette>(keelCtx(m_tctx), m_img.defaultPalette).value),
|
|
||||||
m_undoStack(undoStack) {
|
|
||||||
normalizeSubsheets(m_img.subsheet);
|
|
||||||
m_pal.updated.connect(this, &TileSheetEditorModel::markUpdated);
|
|
||||||
m_undoStack.changeTriggered.connect(this, &TileSheetEditorModel::markUpdatedCmdId);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::cut() {
|
|
||||||
if (!m_selection) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
TileSheetClipboard blankCb;
|
|
||||||
auto cb = ox::make_unique<TileSheetClipboard>();
|
|
||||||
auto const&s = activeSubSheet();
|
|
||||||
iterateSelectionRows(*m_selection, [&](int x, int y) {
|
|
||||||
auto pt = ox::Point{x, y};
|
|
||||||
auto const idx = core::idx(s, pt);
|
|
||||||
auto const c = getPixel(s, m_img.bpp, idx);
|
|
||||||
pt -= m_selection->a;
|
|
||||||
cb->addPixel(pt, c);
|
|
||||||
blankCb.addPixel(pt, 0);
|
|
||||||
});
|
|
||||||
auto const pt1 = m_selection->a;
|
|
||||||
auto const pt2 = ox::Point{s.columns * TileWidth, s.rows * TileHeight};
|
|
||||||
turbine::setClipboardObject(m_tctx, std::move(cb));
|
|
||||||
pushCommand(ox::make<CutPasteCommand>(CommandId::Cut, m_img, m_activeSubsSheetIdx, pt1, pt2, blankCb));
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::copy() {
|
|
||||||
if (!m_selection) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
auto cb = ox::make_unique<TileSheetClipboard>();
|
|
||||||
iterateSelectionRows(*m_selection, [&](int x, int y) {
|
|
||||||
auto pt = ox::Point{x, y};
|
|
||||||
const auto&s = activeSubSheet();
|
|
||||||
const auto idx = core::idx(s, pt);
|
|
||||||
const auto c = getPixel(s, m_img.bpp, idx);
|
|
||||||
pt -= m_selection->a;
|
|
||||||
cb->addPixel(pt, c);
|
|
||||||
});
|
|
||||||
turbine::setClipboardObject(m_tctx, std::move(cb));
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::paste() {
|
|
||||||
if (!m_selection) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
auto [cb, err] = turbine::getClipboardObject<TileSheetClipboard>(m_tctx);
|
|
||||||
if (err) {
|
|
||||||
oxLogError(err);
|
|
||||||
oxErrf("Could not read clipboard: {}", toStr(err));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
auto const&s = activeSubSheet();
|
|
||||||
auto const pt1 = m_selection->a;
|
|
||||||
auto const pt2 = ox::Point{s.columns * TileWidth, s.rows * TileHeight};
|
|
||||||
pushCommand(ox::make<CutPasteCommand>(CommandId::Paste, m_img, m_activeSubsSheetIdx, pt1, pt2, *cb));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TileSheetEditorModel::acceptsClipboardPayload() const noexcept {
|
|
||||||
auto const cb = getClipboardObject<TileSheetClipboard>(m_tctx);
|
|
||||||
return cb.ok();
|
|
||||||
}
|
|
||||||
|
|
||||||
ox::StringView TileSheetEditorModel::palPath() const noexcept {
|
|
||||||
auto [path, err] = m_img.defaultPalette.getPath();
|
|
||||||
if (err) {
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
constexpr ox::StringView uuidPrefix = "uuid://";
|
|
||||||
if (ox::beginsWith(path, uuidPrefix)) {
|
|
||||||
auto uuid = ox::StringView(&path[uuidPrefix.bytes()], path.bytes() - uuidPrefix.bytes());
|
|
||||||
auto out = keelCtx(m_tctx).uuidToPath.at(uuid);
|
|
||||||
if (out.error) {
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
return *out.value;
|
|
||||||
} else {
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ox::Error TileSheetEditorModel::setPalette(ox::StringView path) noexcept {
|
|
||||||
OX_REQUIRE(uuid, keelCtx(m_tctx).pathToUuid.at(path));
|
|
||||||
pushCommand(ox::make<PaletteChangeCommand>(activeSubSheetIdx(), m_img, uuid->toString()));
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::setPalettePage(size_t pg) noexcept {
|
|
||||||
m_palettePage = ox::clamp<size_t>(pg, 0, m_pal->pages.size() - 1);
|
|
||||||
m_updated = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t TileSheetEditorModel::palettePage() const noexcept {
|
|
||||||
return m_palettePage;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::drawCommand(ox::Point const&pt, std::size_t palIdx) noexcept {
|
|
||||||
const auto &activeSubSheet = getSubSheet(m_img, m_activeSubsSheetIdx);
|
|
||||||
if (pt.x >= activeSubSheet.columns * TileWidth || pt.y >= activeSubSheet.rows * TileHeight) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const auto idx = core::idx(activeSubSheet, pt);
|
|
||||||
if (m_ongoingDrawCommand) {
|
|
||||||
m_updated = m_updated || m_ongoingDrawCommand->append(idx);
|
|
||||||
} else if (getPixel(activeSubSheet, m_img.bpp, idx) != palIdx) {
|
|
||||||
pushCommand(ox::make<DrawCommand>(m_img, m_activeSubsSheetIdx, idx, static_cast<int>(palIdx)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::endDrawCommand() noexcept {
|
|
||||||
m_ongoingDrawCommand = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::addSubsheet(TileSheet::SubSheetIdx const&parentIdx) noexcept {
|
|
||||||
pushCommand(ox::make<AddSubSheetCommand>(m_img, parentIdx));
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::rmSubsheet(TileSheet::SubSheetIdx const&idx) noexcept {
|
|
||||||
pushCommand(ox::make<RmSubSheetCommand>(m_img, idx));
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::insertTiles(TileSheet::SubSheetIdx const&idx, std::size_t tileIdx, std::size_t tileCnt) noexcept {
|
|
||||||
pushCommand(ox::make<InsertTilesCommand>(m_img, idx, tileIdx, tileCnt));
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::deleteTiles(TileSheet::SubSheetIdx const&idx, std::size_t tileIdx, std::size_t tileCnt) noexcept {
|
|
||||||
pushCommand(ox::make<DeleteTilesCommand>(m_img, idx, tileIdx, tileCnt));
|
|
||||||
}
|
|
||||||
|
|
||||||
ox::Error TileSheetEditorModel::updateSubsheet(TileSheet::SubSheetIdx const&idx, ox::StringView const&name, int cols, int rows) noexcept {
|
|
||||||
pushCommand(ox::make<UpdateSubSheetCommand>(m_img, idx, ox::String(name), cols, rows));
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::setActiveSubsheet(TileSheet::SubSheetIdx const&idx) noexcept {
|
|
||||||
m_activeSubsSheetIdx = idx;
|
|
||||||
this->activeSubsheetChanged.emit(m_activeSubsSheetIdx);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::fill(ox::Point const&pt, int palIdx) noexcept {
|
|
||||||
auto const&activeSubSheet = getSubSheet(m_img, m_activeSubsSheetIdx);
|
|
||||||
// build idx list
|
|
||||||
if (pt.x >= activeSubSheet.columns * TileWidth || pt.y >= activeSubSheet.rows * TileHeight) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ox::Array<bool, PixelsPerTile> updateMap = {};
|
|
||||||
auto const oldColor = getPixel(activeSubSheet, m_img.bpp, pt);
|
|
||||||
getFillPixels(updateMap, pt, oldColor);
|
|
||||||
ox::Vector<std::size_t> idxList;
|
|
||||||
auto i = core::idx(activeSubSheet, pt) / PixelsPerTile * PixelsPerTile;
|
|
||||||
for (auto u : updateMap) {
|
|
||||||
if (u) {
|
|
||||||
idxList.emplace_back(i);
|
|
||||||
}
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
// do updates to sheet
|
|
||||||
if (m_ongoingDrawCommand) {
|
|
||||||
m_updated = m_updated || m_ongoingDrawCommand->append(idxList);
|
|
||||||
} else if (getPixel(activeSubSheet, m_img.bpp, pt) != palIdx) {
|
|
||||||
pushCommand(ox::make<DrawCommand>(m_img, m_activeSubsSheetIdx, idxList, palIdx));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::setSelection(studio::Selection const&sel) noexcept {
|
|
||||||
m_selection.emplace(sel);
|
|
||||||
m_updated = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::select(ox::Point const&pt) noexcept {
|
|
||||||
if (m_selTracker.updateCursorPoint(pt)) {
|
|
||||||
setSelection(m_selTracker.selection());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::completeSelection() noexcept {
|
|
||||||
if (m_selTracker.selectionOngoing()) {
|
|
||||||
m_selTracker.finishSelection();
|
|
||||||
m_selection.emplace(m_selTracker.selection());
|
|
||||||
auto&pt = m_selection->b;
|
|
||||||
auto&s = activeSubSheet();
|
|
||||||
pt.x = ox::min(s.columns * TileWidth - 1, pt.x);
|
|
||||||
pt.y = ox::min(s.rows * TileHeight - 1, pt.y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::clearSelection() noexcept {
|
|
||||||
m_updated = true;
|
|
||||||
m_selTracker.reset();
|
|
||||||
m_selection.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TileSheetEditorModel::updated() const noexcept {
|
|
||||||
return m_updated;
|
|
||||||
}
|
|
||||||
|
|
||||||
ox::Error TileSheetEditorModel::markUpdatedCmdId(studio::UndoCommand const*cmd) noexcept {
|
|
||||||
m_updated = true;
|
|
||||||
const auto cmdId = cmd->commandId();
|
|
||||||
if (static_cast<CommandId>(cmdId) == CommandId::PaletteChange) {
|
|
||||||
OX_RETURN_ERROR(readObj<Palette>(keelCtx(m_tctx), m_img.defaultPalette).moveTo(m_pal));
|
|
||||||
m_palettePage = ox::min<size_t>(m_pal->pages.size(), 0);
|
|
||||||
paletteChanged.emit();
|
|
||||||
}
|
|
||||||
auto tsCmd = dynamic_cast<const TileSheetCommand*>(cmd);
|
|
||||||
auto idx = validateSubSheetIdx(m_img, tsCmd->subsheetIdx());
|
|
||||||
if (idx != m_activeSubsSheetIdx) {
|
|
||||||
setActiveSubsheet(idx);
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
ox::Error TileSheetEditorModel::markUpdated() noexcept {
|
|
||||||
m_updated = true;
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::ackUpdate() noexcept {
|
|
||||||
m_updated = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ox::Error TileSheetEditorModel::saveFile() noexcept {
|
|
||||||
return m_sctx.project->writeObj(m_path, m_img, ox::ClawFormat::Metal);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TileSheetEditorModel::pixelSelected(std::size_t idx) const noexcept {
|
|
||||||
auto const&s = activeSubSheet();
|
|
||||||
auto const pt = idxToPt(static_cast<int>(idx), s.columns);
|
|
||||||
return m_selection && m_selection->contains(pt);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::getFillPixels(ox::Span<bool> pixels, ox::Point const&pt, int oldColor) const noexcept {
|
|
||||||
const auto &activeSubSheet = this->activeSubSheet();
|
|
||||||
const auto tileIdx = [activeSubSheet](const ox::Point &pt) noexcept {
|
|
||||||
return ptToIdx(pt, activeSubSheet.columns) / PixelsPerTile;
|
|
||||||
};
|
|
||||||
// get points
|
|
||||||
const auto leftPt = pt + ox::Point(-1, 0);
|
|
||||||
const auto rightPt = pt + ox::Point(1, 0);
|
|
||||||
const auto topPt = pt + ox::Point(0, -1);
|
|
||||||
const auto bottomPt = pt + ox::Point(0, 1);
|
|
||||||
// calculate indices
|
|
||||||
const auto idx = ptToIdx(pt, activeSubSheet.columns);
|
|
||||||
const auto leftIdx = ptToIdx(leftPt, activeSubSheet.columns);
|
|
||||||
const auto rightIdx = ptToIdx(rightPt, activeSubSheet.columns);
|
|
||||||
const auto topIdx = ptToIdx(topPt, activeSubSheet.columns);
|
|
||||||
const auto bottomIdx = ptToIdx(bottomPt, activeSubSheet.columns);
|
|
||||||
const auto tile = tileIdx(pt);
|
|
||||||
// mark pixels to update
|
|
||||||
pixels[idx % PixelsPerTile] = true;
|
|
||||||
if (!pixels[leftIdx % PixelsPerTile] && tile == tileIdx(leftPt) && getPixel(activeSubSheet, m_img.bpp, leftIdx) == oldColor) {
|
|
||||||
getFillPixels(pixels, leftPt, oldColor);
|
|
||||||
}
|
|
||||||
if (!pixels[rightIdx % PixelsPerTile] && tile == tileIdx(rightPt) && getPixel(activeSubSheet, m_img.bpp, rightIdx) == oldColor) {
|
|
||||||
getFillPixels(pixels, rightPt, oldColor);
|
|
||||||
}
|
|
||||||
if (!pixels[topIdx % PixelsPerTile] && tile == tileIdx(topPt) && getPixel(activeSubSheet, m_img.bpp, topIdx) == oldColor) {
|
|
||||||
getFillPixels(pixels, topPt, oldColor);
|
|
||||||
}
|
|
||||||
if (!pixels[bottomIdx % PixelsPerTile] && tile == tileIdx(bottomPt) && getPixel(activeSubSheet, m_img.bpp, bottomIdx) == oldColor) {
|
|
||||||
getFillPixels(pixels, bottomPt, oldColor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileSheetEditorModel::pushCommand(studio::UndoCommand *cmd) noexcept {
|
|
||||||
std::ignore = m_undoStack.push(ox::UPtr<studio::UndoCommand>(cmd));
|
|
||||||
m_ongoingDrawCommand = dynamic_cast<DrawCommand*>(cmd);
|
|
||||||
m_updated = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
add_executable(
|
|
||||||
NostalgiaCoreTest
|
|
||||||
tests.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries(
|
|
||||||
NostalgiaCoreTest
|
|
||||||
NostalgiaCore
|
|
||||||
)
|
|
||||||
|
|
||||||
add_test("[NostalgiaCore] readWriteTileSheet" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/NostalgiaCoreTest readWriteTileSheet)
|
|
@ -7,12 +7,12 @@
|
|||||||
#include <ox/std/math.hpp>
|
#include <ox/std/math.hpp>
|
||||||
#include <ox/std/types.hpp>
|
#include <ox/std/types.hpp>
|
||||||
|
|
||||||
namespace nostalgia::core {
|
namespace nostalgia::gfx {
|
||||||
|
|
||||||
using Color16 = uint16_t;
|
using Color16 = uint16_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Nostalgia Core logically uses 16 bit colors, but must translate that to 32
|
* Nostalgia logically uses 16 bit colors, but must translate that to 32
|
||||||
* bit colors in some implementations.
|
* bit colors in some implementations.
|
||||||
*/
|
*/
|
||||||
using Color32 = uint32_t;
|
using Color32 = uint32_t;
|
||||||
@ -154,7 +154,7 @@ static_assert(color16(16, 32, 8) == 9200);
|
|||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr Color16 applySelectionColor(Color16 const color) noexcept {
|
constexpr Color16 applySelectionColor(Color16 const color) noexcept {
|
||||||
namespace core = nostalgia::core;
|
namespace core = nostalgia::gfx;
|
||||||
auto const r = core::red16(color) / 2;
|
auto const r = core::red16(color) / 2;
|
||||||
auto const g = (core::green16(color) + 20) / 2;
|
auto const g = (core::green16(color) + 20) / 2;
|
||||||
auto const b = (core::blue16(color) + 31) / 2;
|
auto const b = (core::blue16(color) + 31) / 2;
|
@ -6,13 +6,14 @@
|
|||||||
|
|
||||||
#include <ox/std/stringliteral.hpp>
|
#include <ox/std/stringliteral.hpp>
|
||||||
|
|
||||||
namespace nostalgia::core {
|
namespace nostalgia::gfx {
|
||||||
|
|
||||||
constexpr auto TileWidth = 8;
|
constexpr auto TileWidth = 8;
|
||||||
constexpr auto TileHeight = 8;
|
constexpr auto TileHeight = 8;
|
||||||
constexpr auto PixelsPerTile = TileWidth * TileHeight;
|
constexpr auto PixelsPerTile = TileWidth * TileHeight;
|
||||||
|
|
||||||
constexpr ox::StringLiteral FileExt_ng("ng");
|
constexpr ox::StringLiteral FileExt_ng("ng");
|
||||||
|
constexpr ox::StringLiteral FileExt_nts("nts");
|
||||||
constexpr ox::StringLiteral FileExt_npal("npal");
|
constexpr ox::StringLiteral FileExt_npal("npal");
|
||||||
|
|
||||||
}
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user