Initial commit

This commit is contained in:
Edgaru089 2024-02-29 09:48:29 +08:00
commit a6642911d7
15 changed files with 1365 additions and 0 deletions

63
.gitattributes vendored Normal file
View File

@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain

363
.gitignore vendored Normal file
View File

@ -0,0 +1,363 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Oo]ut/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd

31
JacksEscape.sln Normal file
View File

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.9.34622.214
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JacksEscape", "JacksEscape.vcxproj", "{C7225F7B-40C6-4C57-98A9-F7D751A53D28}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C7225F7B-40C6-4C57-98A9-F7D751A53D28}.Debug|x64.ActiveCfg = Debug|x64
{C7225F7B-40C6-4C57-98A9-F7D751A53D28}.Debug|x64.Build.0 = Debug|x64
{C7225F7B-40C6-4C57-98A9-F7D751A53D28}.Debug|x86.ActiveCfg = Debug|Win32
{C7225F7B-40C6-4C57-98A9-F7D751A53D28}.Debug|x86.Build.0 = Debug|Win32
{C7225F7B-40C6-4C57-98A9-F7D751A53D28}.Release|x64.ActiveCfg = Release|x64
{C7225F7B-40C6-4C57-98A9-F7D751A53D28}.Release|x64.Build.0 = Release|x64
{C7225F7B-40C6-4C57-98A9-F7D751A53D28}.Release|x86.ActiveCfg = Release|Win32
{C7225F7B-40C6-4C57-98A9-F7D751A53D28}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {366A3442-CF71-45E8-9C4F-D2BCB7223B10}
EndGlobalSection
EndGlobal

144
JacksEscape.vcxproj Normal file
View File

@ -0,0 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{c7225f7b-40c6-4c57-98a9-f7d751a53d28}</ProjectGuid>
<RootNamespace>JacksEscape</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="util\minmax.h" />
<ClInclude Include="util\queue.h" />
<ClInclude Include="util\tree.h" />
<ClInclude Include="util\tree_internal.h" />
<ClInclude Include="util\vector.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="util\queue.c" />
<ClCompile Include="util\tree.c" />
<ClCompile Include="util\vector.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="源文件">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="头文件">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="资源文件">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="Util">
<UniqueIdentifier>{81dbe199-c614-445b-8e13-b76101c45c5e}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="util\minmax.h">
<Filter>Util</Filter>
</ClInclude>
<ClInclude Include="util\queue.h">
<Filter>Util</Filter>
</ClInclude>
<ClInclude Include="util\tree.h">
<Filter>Util</Filter>
</ClInclude>
<ClInclude Include="util\tree_internal.h">
<Filter>Util</Filter>
</ClInclude>
<ClInclude Include="util\vector.h">
<Filter>Util</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="util\queue.c">
<Filter>Util</Filter>
</ClCompile>
<ClCompile Include="util\tree.c">
<Filter>Util</Filter>
</ClCompile>
<ClCompile Include="util\vector.c">
<Filter>Util</Filter>
</ClCompile>
</ItemGroup>
</Project>

21
LICENSE.txt Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) [year] [fullname]
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

64
_clang-format Normal file
View File

@ -0,0 +1,64 @@
---
AccessModifierOffset: '-4'
AlignAfterOpenBracket: AlwaysBreak
AlignConsecutiveMacros: 'true'
AlignConsecutiveAssignments: 'true'
AlignConsecutiveDeclarations: 'true'
AlignEscapedNewlines: Left
AlignOperands: 'true'
AlignTrailingComments: 'true'
AllowAllArgumentsOnNextLine: 'true'
AllowAllConstructorInitializersOnNextLine: 'true'
AllowAllParametersOfDeclarationOnNextLine: 'true'
AllowShortBlocksOnASingleLine: 'true'
AllowShortCaseLabelsOnASingleLine: 'true'
AllowShortFunctionsOnASingleLine: 'true'
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: 'true'
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: 'false'
AlwaysBreakTemplateDeclarations: 'Yes'
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeTernaryOperators: 'false'
BreakStringLiterals: 'true'
ColumnLimit: '0'
CompactNamespaces: 'false'
ConstructorInitializerAllOnOneLineOrOnePerLine: 'true'
FixNamespaceComments: 'true'
IncludeBlocks: Preserve
IndentCaseLabels: 'true'
IndentGotoLabels: 'false'
IndentPPDirectives: None
IndentWidth: '4'
IndentWrappedFunctionNames: 'true'
KeepEmptyLinesAtTheStartOfBlocks: 'false'
Language: Cpp
MaxEmptyLinesToKeep: '2'
NamespaceIndentation: None
PenaltyReturnTypeOnItsOwnLine: '1000'
PointerAlignment: Right
ReflowComments: 'true'
SortIncludes: 'false'
SortUsingDeclarations: 'false'
SpaceAfterCStyleCast: 'false'
SpaceAfterLogicalNot: 'false'
SpaceAfterTemplateKeyword: 'false'
SpaceBeforeAssignmentOperators: 'true'
SpaceBeforeCpp11BracedList: 'false'
SpaceBeforeCtorInitializerColon: 'false'
SpaceBeforeInheritanceColon: 'false'
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: 'false'
SpaceInEmptyParentheses: 'false'
SpacesBeforeTrailingComments: '1'
SpacesInAngles: 'false'
SpacesInCStyleCastParentheses: 'false'
SpacesInContainerLiterals: 'false'
SpacesInParentheses: 'false'
SpacesInSquareBrackets: 'false'
Standard: Cpp11
TabWidth: '4'
UseTab: ForContinuationAndIndentation
...

43
util/minmax.h Normal file
View File

@ -0,0 +1,43 @@
#pragma once
static inline int intmin(int x, int y) {
return x < y ? x : y;
}
static inline int intmax(int x, int y) {
return x > y ? x : y;
}
static inline int intmin3(int x, int y, int z) {
if (x < y)
if (x < z)
return x;
else
return z;
else if (y < z)
return y;
else
return z;
}
static inline int intmax3(int x, int y, int z) {
if (x > y)
if (x > z)
return x;
else
return z;
else if (y > z)
return y;
else
return z;
}
static inline int intminmax(int x, int min, int max) {
if (x < min)
return min;
else if (x > max)
return max;
else
return x;
}

72
util/queue.c Normal file
View File

@ -0,0 +1,72 @@
#include "queue.h"
#include <stdio.h>
void queue_InitBuffered(queue *q, void *buffer, uintptr_t size) {
q->data = q->begin = q->end = buffer;
q->size = size;
q->count = 0;
}
void queue_PushByte(queue *q, const uint8_t b) {
if (q->count == q->size) { // no more space
fprintf(stderr, "queue_PushByte: full[%llu bytes], discarding byte 0x%x\n", q->size, b);
return;
}
q->count++;
*((uint8_t *)(q->end++)) = b;
if (q->end == q->data + q->size)
q->end = q->data; // out of the buffer: wrap around
}
uint8_t queue_PopByte(queue *q) {
if (q->count == 0) {
fprintf(stderr, "queue_PopByte: poping an empty queue\n");
return 0;
}
q->count--;
uint8_t data = *((uint8_t *)(q->begin++));
if (q->begin == q->data + q->size)
q->begin = q->data; // wrap around
return data;
}
void queue_Push(queue *q, const void *buffer, uintptr_t size) {
// TODO Optimize queue_Push and queue_Pop
if (queue_Space(q) < size)
return;
for (const uint8_t *i = buffer; i < (const uint8_t *)buffer + size; i++)
queue_PushByte(q, *i);
}
uintptr_t queue_Pop(queue *q, void *buffer, uintptr_t size) {
if (queue_Size(q) < size)
return 0;
for (uint8_t *i = buffer; i < (uint8_t *)buffer + size; i++)
*i = queue_PopByte(q);
return size;
}
uint8_t queue_FrontByte(queue *q) {
if (q->count == 0) {
fprintf(stderr, "queue_TopByte: accessing an empty queue\n");
return 0;
}
return *((uint8_t *)q->begin);
}
bool queue_Empty(queue *q) {
return q->count == 0;
}
uintptr_t queue_Size(queue *q) {
return q->count;
}
uintptr_t queue_Space(queue *q) {
return q->size - q->count;
}

49
util/queue.h Normal file
View File

@ -0,0 +1,49 @@
#pragma once
#include <stdint.h>
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
uint8_t *data; // the data buffer
uintptr_t size; // size of data buffer
uint8_t *begin, *end; // begin and past-the-end for in-queue data
uintptr_t count; // number of in-queue bytes
} queue;
// initialize a queue with a existing buffer
void queue_InitBuffered(queue *q, void *buffer, uintptr_t size);
// writes one byte to the queue, discarding if full
void queue_PushByte(queue *q, const uint8_t b);
// pops one byte from the front of the queue, returning it
uint8_t queue_PopByte(queue *q);
// write Size bytes to the queue, none written if there is not space for all the bytes
void queue_Push(queue *q, const void *buffer, uintptr_t size);
// pops Size bytes from the queue, none popped if there are no enough data
// returns the number of bytes popped (either Size or 0)
uintptr_t queue_Pop(queue *q, void *buffer, uintptr_t size);
// return the byte at the front of the queue
uint8_t queue_FrontByte(queue *q);
// tells if the queue is empty
bool queue_Empty(queue *q);
// returns the number of bytes in the queue
uintptr_t queue_Size(queue *q);
// returns the empty space left at the end of the queue
uintptr_t queue_Space(queue *q);
#ifdef __cplusplus
}
#endif

176
util/tree.c Normal file
View File

@ -0,0 +1,176 @@
#include "tree.h"
#include "tree_internal.h"
#include <stdlib.h>
#include <string.h>
// Create allocates and creates a new default Tree object.
tree_Tree *tree_Create(uintptr_t objectSize) {
tree_Tree *t = malloc(sizeof(tree_Tree));
t->objectSize = objectSize;
t->size = 0;
t->root = 0;
return t;
}
static inline tree_Node *__tree_NewNode(tree_Tree *t, uintptr_t key, tree_Node *father, uintptr_t internal) {
t->size++;
tree_Node *node = malloc(sizeof(tree_Node) - 1 + t->objectSize);
node->left = node->right = 0;
node->father = father;
node->key = key;
node->internal = internal;
return node;
}
static void __tree_DestroyNodes(tree_Node *node) {
if (node->left)
__tree_DestroyNodes(node->left);
if (node->right)
__tree_DestroyNodes(node->right);
free(node);
}
void tree_Destroy(tree_Tree *tree) {
if (tree->root)
__tree_DestroyNodes(tree->root);
free(tree);
}
// Will not return NULL
tree_Node *__tree_InsertNodes(tree_Tree *t, tree_Node *node, tree_Node *father, uintptr_t key, tree_Node **result, bool *added) {
if (!node) {
if (added)
*added = true;
#ifdef HELOS_UTIL_TREE_TYPE_TREAP
return *result = __tree_NewNode(t, key, father, random_Rand() ^ key);
#else
return *result = __tree_NewNode(t, key, father, 0);
#endif
} else if (key < node->key) {
node->left = __tree_InsertNodes(t, node->left, node, key, result, added);
return node;
} else if (key > node->key) {
node->right = __tree_InsertNodes(t, node->right, node, key, result, added);
return node;
} else {
if (added)
*added = false;
*result = node;
return node;
}
}
tree_Node *tree_InsertNode(tree_Tree *t, uintptr_t key, bool *added) {
tree_Node *result;
t->root = __tree_InsertNodes(t, t->root, 0, key, &result, added);
#ifdef HELOS_UTIL_TREE_TYPE_TREAP
if (*added)
__tree_treap_Adjust(result, &t->root);
#endif
return result;
}
void *tree_Insert(tree_Tree *t, uintptr_t key, bool *added) {
return tree_InsertNode(t, key, added)->data;
}
static tree_Node *__tree_FindNode(tree_Node *node, uintptr_t key) {
if (!node)
return NULL;
else if (key < node->key)
return __tree_FindNode(node->left, key);
else if (key > node->key)
return __tree_FindNode(node->right, key);
else
return node;
}
tree_Node *tree_FindNode(tree_Tree *t, uintptr_t key) {
return __tree_FindNode(t->root, key);
}
void *tree_Find(tree_Tree *t, uintptr_t key) {
tree_Node *node = tree_FindNode(t, key);
if (!node)
return NULL;
else
return node->data;
}
void tree_Delete(tree_Tree *t, tree_Node *node) {
#ifdef HELOS_UTIL_TREE_TYPE_TREAP
while (node->left && node->right)
if (node->left->internal < node->right->internal)
__tree_Rotate(node->left, &t->root);
else
__tree_Rotate(node->right, &t->root);
#else
while (node->left)
__tree_Rotate(node->left, &t->root);
#endif
if (node == t->root)
t->root = (node->left ? node->left : node->right);
__tree_Connect(node->father, (node->left ? node->left : node->right), __tree_Tell(node));
free(node);
}
tree_Node *tree_FirstNode(tree_Tree *tree) {
tree_Node *result = tree->root;
if (!result)
return 0;
while (result->right)
result = result->left;
return result;
}
tree_Node *tree_LastNode(tree_Tree *tree) {
tree_Node *result = tree->root;
if (!result)
return 0;
while (result->right)
result = result->right;
return result;
}
tree_Node *tree_Node_Next(tree_Node *node) {
if (node->right) {
tree_Node *result = node->right;
while (result->left)
result = result->left;
return result;
} else {
tree_Node *result = node;
while (result->father && __tree_Tell(result) == __tree_Right)
result = result->father;
return result->father;
}
}
// Node_Previous returns the previous node. Returns NULL if first.
tree_Node *tree_Node_Previous(tree_Node *node) {
if (node->left) {
tree_Node *result = node->left;
while (result->right)
result = result->right;
return result;
} else {
tree_Node *result = node;
while (result->father && __tree_Tell(result) == __tree_Left)
result = result->father;
return result->father;
}
}

75
util/tree.h Normal file
View File

@ -0,0 +1,75 @@
#pragma once
#include <stdint.h>
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct __tree_Node {
uintptr_t key; // node key
struct __tree_Node *left, *right; // left and right sons
struct __tree_Node *father; // father node
uintptr_t internal; // internal data for balanced trees
char data[1]; // placeholder for object data
} tree_Node;
// Tree is a basic tree-based associative container.
//
// Right now it's a Treap.
typedef struct {
uintptr_t objectSize; // size in bytes of the object
tree_Node *root; // root of the tree, NULL if empty
uintptr_t size; // number of objects in the tree
} tree_Tree;
// Create allocates and creates a new default Tree object.
tree_Tree *tree_Create(uintptr_t objectSize);
// Destroy properly frees all data related to the structure, and itself.
void tree_Destroy(tree_Tree *tree);
// Insert inserts a new object (or locates an existing one).
//
// If *added is not NULL, it is set to true if the key does
// not exist and is actually added.
//
// Newly allocated data is not zeroed, nor initialized in any way.
//
// Returns the pointer to the newly allocated (or existing) data.
void *tree_Insert(tree_Tree *tree, uintptr_t key, bool *added);
// InsertNode does the same as Insert, but returns Node* instead of data.
tree_Node *tree_InsertNode(tree_Tree *tree, uintptr_t key, bool *added);
// Find locates an existing object by its key.
//
// Returns NULL if the object does not exist.
void *tree_Find(tree_Tree *tree, uintptr_t key);
// FindNode returns an existing tree node by its key.
//
// Used for iterating the tree objects.
tree_Node *tree_FindNode(tree_Tree *tree, uintptr_t key);
// FirstNode returns the first node in increasing order.
tree_Node *tree_FirstNode(tree_Tree *tree);
// LastNode returns the last node in increasing order.
tree_Node *tree_LastNode(tree_Tree *tree);
// Delete deletes an existing node from the tree.
void tree_Delete(tree_Tree *tree, tree_Node *node);
// Node_Next returns the next node. Returns NULL if the node is the last.
tree_Node *tree_Node_Next(tree_Node *node);
// Node_Previous returns the previous node. Returns NULL if first.
tree_Node *tree_Node_Previous(tree_Node *node);
#ifdef __cplusplus
}
#endif

60
util/tree_internal.h Normal file
View File

@ -0,0 +1,60 @@
#pragma once
#include "tree.h"
typedef enum {
__tree_Left,
__tree_Right,
} __tree_ConnectType;
static inline __tree_ConnectType __tree_ConnectType_Invert(__tree_ConnectType type) {
return (__tree_ConnectType)(!type);
}
static inline __tree_ConnectType __tree_Tell(tree_Node *son) {
if (!son->father)
return __tree_Left;
if (son->father->left == son)
return __tree_Left;
else
return __tree_Right;
}
static inline tree_Node *__tree_Get(tree_Node *father, __tree_ConnectType type) {
return (type == __tree_Left) ? father->left : father->right;
}
static inline void __tree_Connect(tree_Node *father, tree_Node *son, __tree_ConnectType type) {
if (son)
son->father = father;
if (father) {
if (type == __tree_Left)
father->left = son;
else
father->right = son;
}
}
// Rotates the node up.
static inline void __tree_Rotate(tree_Node *node, tree_Node **root) {
if (!node->father)
return;
__tree_ConnectType type = __tree_Tell(node);
tree_Node *f = node->father,
*b = __tree_Get(node, __tree_ConnectType_Invert(type));
__tree_Connect(f->father, node, __tree_Tell(f));
__tree_Connect(node, f, __tree_ConnectType_Invert(type));
__tree_Connect(f, b, type);
if (!node->father)
*root = node;
}
// Adjust the tree as a Treap
static inline void __tree_treap_Adjust(tree_Node *node, tree_Node **root) {
while (node->father && node->father->internal > node->internal)
__tree_Rotate(node, root);
}

91
util/vector.c Normal file
View File

@ -0,0 +1,91 @@
#include "vector.h"
#include "string.h"
#include "stdlib.h"
vector_Vector *vector_Create(uintptr_t objectSize) {
vector_Vector *vec = malloc(sizeof(vector_Vector));
vec->objectSize = objectSize;
vec->size = 0;
vec->data = 0;
vec->data = malloc(objectSize);
vec->cap = objectSize;
return vec;
}
// Resizes the underlying buffer to a new capacity
static inline void __vector_Rebuffer(vector_Vector *vec, uintptr_t newcap) {
void *newbuf = malloc(newcap);
memcpy(newbuf, vec->data, vec->size);
free(vec->data);
vec->data = newbuf;
vec->cap = newcap;
}
void vector_Destroy(vector_Vector *vec) {
free(vec->data);
free(vec);
}
void *vector_Push(vector_Vector *vec, const void *data) {
vector_Append(vec, data, 1);
return vec->data + vec->size - vec->objectSize;
}
void vector_Append(vector_Vector *vec, const void *data, uintptr_t n) {
uintptr_t oldsize = vec->size, addsize = vec->objectSize * n;
vector_Resize(vec, oldsize + addsize);
if (data)
memcpy(vec->data + oldsize, data, addsize);
else
memset(vec->data + oldsize, 0, addsize);
}
void vector_Resize(vector_Vector *vec, uintptr_t size) {
uintptr_t newsize = vec->size + size * vec->objectSize;
if (newsize > vec->cap) {
// grow the buffer exponentially
uint64_t newcap = vec->cap;
while (newcap < newsize)
newcap *= 2;
__vector_Rebuffer(vec, newcap);
}
vec->size = newsize;
}
uintptr_t vector_Size(vector_Vector *vec) {
return vec->size / vec->objectSize;
}
void vector_Clear(vector_Vector *vec) {
vec->size = 0;
}
void vector_ShrinkBuffer(vector_Vector *vec) {
if (vec->size != vec->cap)
__vector_Rebuffer(vec, vec->size);
}
uintptr_t vector_Capacity(vector_Vector *vec) {
return vec->cap / vec->objectSize;
}
void vector_Reserve(vector_Vector *vec, uintptr_t cap) {
uintptr_t newcap = vec->objectSize * cap;
if (newcap > vec->cap)
__vector_Rebuffer(vec, newcap);
}
void *vector_At(vector_Vector *vec, uintptr_t i) {
return vec->data + vec->objectSize * i;
}
// Data returns the data buffer.
void *vector_Data(vector_Vector *vec) {
return vec->data;
}

65
util/vector.h Normal file
View File

@ -0,0 +1,65 @@
#pragma once
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
// Vector is an automatic-resizing array.
typedef struct {
uint8_t *data; // actual data buffer
uintptr_t size, cap; // size of the data and buffer, in bytes
uintptr_t objectSize; // size of the object
} vector_Vector;
// Create allocates a new vector.
vector_Vector *vector_Create(uintptr_t objectSize);
// Destroy properly frees all data related to the structure, and itself.
void vector_Destroy(vector_Vector *vec);
// Push pushes an object at the back of the vector.
//
// If data is NULL, the data is zeroed.
//
// Returns a pointer to data.
void *vector_Push(vector_Vector *vec, const void *data);
// Append pushes multiple objects at the back of the buffer.
//
// If data is NULL, the data is zeroed.
void vector_Append(vector_Vector *vec, const void *data, uintptr_t n);
// Resize resizes the vector to a new number of elements.
void vector_Resize(vector_Vector *vec, uintptr_t size);
// Size returns the number of objects in a vector.
uintptr_t vector_Size(vector_Vector *vec);
// Clear clears a vector, without resizing the buffer.
void vector_Clear(vector_Vector *vec);
// ShrinkBuffer shrinks the internal buffer to exactly the size of the elements.
void vector_ShrinkBuffer(vector_Vector *vec);
// Capacity returns the size of the internal buffer.
uintptr_t vector_Capacity(vector_Vector *vec);
// Reserve reallocates the size of the buffer to CAP objects,
// if the current buffer is smaller.
void vector_Reserve(vector_Vector *vec, uintptr_t cap);
// At returns the i-th object of the vector.
//
// No boundary test is performed.
void *vector_At(vector_Vector *vec, uintptr_t i);
// Data returns the data buffer.
void *vector_Data(vector_Vector *vec);
#ifdef __cplusplus
}
#endif