mirror of
https://gitlab.com/niansa/asbots.git
synced 2025-03-06 20:48:25 +01:00
Initial commit
This commit is contained in:
commit
0ea7ec3437
8 changed files with 846 additions and 0 deletions
18
CMakeLists.txt
Normal file
18
CMakeLists.txt
Normal file
|
@ -0,0 +1,18 @@
|
|||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(asbots LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
add_executable(asbots
|
||||
main.cpp
|
||||
instance.cpp
|
||||
config.cpp
|
||||
)
|
||||
|
||||
find_package(PkgConfig REQUIRED)
|
||||
pkg_check_modules(libasync-uv REQUIRED IMPORTED_TARGET libasync-uv)
|
||||
pkg_check_modules(fmt REQUIRED IMPORTED_TARGET fmt)
|
||||
|
||||
target_link_libraries(asbots PRIVATE PkgConfig::libasync-uv PkgConfig::fmt)
|
372
CMakeLists.txt.user
Normal file
372
CMakeLists.txt.user
Normal file
|
@ -0,0 +1,372 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE QtCreatorProject>
|
||||
<!-- Written by QtCreator 4.15.0, 2021-06-17T22:45:49. -->
|
||||
<qtcreator>
|
||||
<data>
|
||||
<variable>EnvironmentId</variable>
|
||||
<value type="QByteArray">{5d908aae-49cb-4b8b-8f9a-9f24b78d3565}</value>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
||||
<value type="int">0</value>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
||||
<valuemap type="QVariantMap">
|
||||
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
|
||||
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
|
||||
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
||||
<value type="QString" key="language">Cpp</value>
|
||||
<valuemap type="QVariantMap" key="value">
|
||||
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
|
||||
</valuemap>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
|
||||
<value type="QString" key="language">QmlJS</value>
|
||||
<valuemap type="QVariantMap" key="value">
|
||||
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
|
||||
</valuemap>
|
||||
</valuemap>
|
||||
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
|
||||
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
|
||||
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
||||
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
||||
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
||||
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
|
||||
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
|
||||
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
||||
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
||||
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
|
||||
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
|
||||
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
|
||||
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
|
||||
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
|
||||
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
||||
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
||||
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
||||
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
||||
<value type="bool" key="EditorConfiguration.UseIndenter">false</value>
|
||||
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
|
||||
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
||||
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
|
||||
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
||||
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
|
||||
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
|
||||
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
|
||||
</valuemap>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
||||
<valuemap type="QVariantMap">
|
||||
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
|
||||
<value type="bool" key="AutoTest.Framework.Boost">true</value>
|
||||
<value type="bool" key="AutoTest.Framework.CTest">false</value>
|
||||
<value type="bool" key="AutoTest.Framework.Catch">true</value>
|
||||
<value type="bool" key="AutoTest.Framework.GTest">true</value>
|
||||
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
|
||||
<value type="bool" key="AutoTest.Framework.QtTest">true</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
|
||||
<value type="int" key="AutoTest.RunAfterBuild">0</value>
|
||||
<value type="bool" key="AutoTest.UseGlobal">true</value>
|
||||
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey"/>
|
||||
<value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
|
||||
<value type="QString" key="ClangCodeModel.WarningConfigId">Builtin.BuildSystem</value>
|
||||
<valuemap type="QVariantMap" key="ClangTools">
|
||||
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
|
||||
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
|
||||
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
|
||||
<value type="int" key="ClangTools.ParallelJobs">2</value>
|
||||
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
|
||||
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
|
||||
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
|
||||
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
|
||||
</valuemap>
|
||||
</valuemap>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.Target.0</variable>
|
||||
<valuemap type="QVariantMap">
|
||||
<value type="QString" key="DeviceType">Desktop</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{fbd9cd40-b514-4726-85e4-90c4e3e2ff63}</value>
|
||||
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
||||
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
||||
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
||||
<value type="QString" key="CMake.Build.Type">Debug</value>
|
||||
<value type="QString" key="CMake.Initial.Parameters">-GUnix Makefiles
|
||||
-DCMAKE_BUILD_TYPE:STRING=Debug
|
||||
-DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake
|
||||
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
|
||||
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
|
||||
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
|
||||
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/mnt/ghdd/Programme/OSS/asbots/../build-asbots-Desktop-Debug</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">all</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">clean</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
|
||||
<value type="QString" key="CMake.Build.Type">Release</value>
|
||||
<value type="QString" key="CMake.Initial.Parameters">-GUnix Makefiles
|
||||
-DCMAKE_BUILD_TYPE:STRING=Release
|
||||
-DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake
|
||||
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
|
||||
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
|
||||
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
|
||||
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/mnt/ghdd/Programme/OSS/asbots/../build-asbots-Desktop-Release</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">all</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">clean</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
|
||||
<value type="QString" key="CMake.Build.Type">RelWithDebInfo</value>
|
||||
<value type="QString" key="CMake.Initial.Parameters">-GUnix Makefiles
|
||||
-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo
|
||||
-DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake
|
||||
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
|
||||
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
|
||||
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
|
||||
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/mnt/ghdd/Programme/OSS/asbots/../build-asbots-Desktop-RelWithDebInfo</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">all</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">clean</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release with Debug Information</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.3">
|
||||
<value type="QString" key="CMake.Build.Type">MinSizeRel</value>
|
||||
<value type="QString" key="CMake.Initial.Parameters">-GUnix Makefiles
|
||||
-DCMAKE_BUILD_TYPE:STRING=MinSizeRel
|
||||
-DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake
|
||||
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
|
||||
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
|
||||
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
|
||||
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/mnt/ghdd/Programme/OSS/asbots/../build-asbots-Desktop-MinSizeRel</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">all</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">clean</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Minimum Size Release</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">4</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
|
||||
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
||||
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
|
||||
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
|
||||
<value type="QString">cpu-cycles</value>
|
||||
</valuelist>
|
||||
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
|
||||
<value type="int" key="Analyzer.Perf.Frequency">250</value>
|
||||
<valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
|
||||
<value type="QString">-e</value>
|
||||
<value type="QString">cpu-cycles</value>
|
||||
<value type="QString">--call-graph</value>
|
||||
<value type="QString">dwarf,4096</value>
|
||||
<value type="QString">-F</value>
|
||||
<value type="QString">250</value>
|
||||
</valuelist>
|
||||
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
|
||||
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
|
||||
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
|
||||
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
|
||||
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
|
||||
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
|
||||
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
|
||||
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
|
||||
<value type="QString" key="Analyzer.Valgrind.Callgrind.Arguments"></value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
|
||||
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
|
||||
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
|
||||
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
|
||||
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
|
||||
<value type="QString" key="Analyzer.Valgrind.Memcheck.Arguments"></value>
|
||||
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
|
||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
|
||||
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
|
||||
<value type="QString" key="Analyzer.Valgrind.ValgrindArguments"></value>
|
||||
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
|
||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
|
||||
<value type="int">0</value>
|
||||
<value type="int">1</value>
|
||||
<value type="int">2</value>
|
||||
<value type="int">3</value>
|
||||
<value type="int">4</value>
|
||||
<value type="int">5</value>
|
||||
<value type="int">6</value>
|
||||
<value type="int">7</value>
|
||||
<value type="int">8</value>
|
||||
<value type="int">9</value>
|
||||
<value type="int">10</value>
|
||||
<value type="int">11</value>
|
||||
<value type="int">12</value>
|
||||
<value type="int">13</value>
|
||||
<value type="int">14</value>
|
||||
</valuelist>
|
||||
<valuelist type="QVariantList" key="CustomOutputParsers"/>
|
||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
|
||||
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value>
|
||||
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
||||
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
||||
</valuemap>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.TargetCount</variable>
|
||||
<value type="int">1</value>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
||||
<value type="int">22</value>
|
||||
</data>
|
||||
<data>
|
||||
<variable>Version</variable>
|
||||
<value type="int">22</value>
|
||||
</data>
|
||||
</qtcreator>
|
19
config.cpp
Normal file
19
config.cpp
Normal file
|
@ -0,0 +1,19 @@
|
|||
#include "config.hpp"
|
||||
|
||||
|
||||
|
||||
Config config = {
|
||||
.connection = {
|
||||
.addr = "127.0.0.1",
|
||||
.port = 6667,
|
||||
},
|
||||
.auth = {
|
||||
.send_password = "849372523412",
|
||||
.accept_password = "843574835765"
|
||||
},
|
||||
.server = {
|
||||
.name = "services.",
|
||||
.description = "A test service!!",
|
||||
.uid = "23X"
|
||||
}
|
||||
};
|
23
config.hpp
Normal file
23
config.hpp
Normal file
|
@ -0,0 +1,23 @@
|
|||
#ifndef _CONFIG_HPP
|
||||
#define _CONFIG_HPP
|
||||
#include "uid.hpp"
|
||||
|
||||
#include <string>
|
||||
|
||||
|
||||
|
||||
struct Config {
|
||||
struct Connection {
|
||||
std::string addr;
|
||||
int port;
|
||||
} connection;
|
||||
struct Auth {
|
||||
std::string send_password, accept_password;
|
||||
} auth;
|
||||
struct Server {
|
||||
std::string name, description;
|
||||
SUID uid; // Fourth one reserved for null-terminator
|
||||
bool hidden = false;
|
||||
} server;
|
||||
} extern config;
|
||||
#endif
|
207
instance.cpp
Normal file
207
instance.cpp
Normal file
|
@ -0,0 +1,207 @@
|
|||
#include "instance.hpp"
|
||||
#include "config.hpp"
|
||||
#include "uid.hpp"
|
||||
|
||||
#include <fmt/format.h>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <ctime>
|
||||
|
||||
using fmt::operator""_format;
|
||||
|
||||
|
||||
|
||||
inline std::string_view operator ""_sv(const char *str, unsigned long len) {
|
||||
return {str, static_cast<std::string_view::size_type>(len)};
|
||||
}
|
||||
|
||||
static std::vector<std::string> strsplit(std::string_view s, char delimiter, std::vector<std::string>::size_type times = 0) {
|
||||
std::vector<std::string> to_return;
|
||||
decltype(s.size()) start = 0, finish = 0;
|
||||
while ((finish = s.find_first_of(delimiter, start)) != std::string_view::npos) {
|
||||
to_return.emplace_back(s.substr(start, finish - start));
|
||||
start = finish + 1;
|
||||
if (to_return.size() == times) { break; }
|
||||
}
|
||||
to_return.emplace_back(s.substr(start));
|
||||
return to_return;
|
||||
}
|
||||
|
||||
|
||||
void Event::parse(std::string_view str) {
|
||||
auto split = strsplit(str, ' ', 2);
|
||||
// Check split size
|
||||
if (split.size() < 2) {
|
||||
throw ParseError("In event parser: Events are expected to have both a sender and name");
|
||||
}
|
||||
// Move values
|
||||
split[0].erase(0, 1); // Erase leading ':'
|
||||
auto id_len = split[0].size();
|
||||
if (id_len == SUID_len) {
|
||||
sender = SUID(std::move(split[0]));
|
||||
} else if (id_len == UUID_len) {
|
||||
sender = UUID(std::move(split[0]));
|
||||
} else {
|
||||
sender = std::move(split[0]);
|
||||
}
|
||||
name = std::move(split[1]);
|
||||
if (split.size() == 3) {
|
||||
// Get args and text
|
||||
split = strsplit(std::move(split[2]), ':', 1);
|
||||
if (split.size() == 2) {
|
||||
text = std::move(split[1]);
|
||||
}
|
||||
if (!split.empty()) {
|
||||
args = std::move(split[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Command::parse(std::string_view str) {
|
||||
auto split = strsplit(str, ' ', 1);
|
||||
name = std::move(split[0]);
|
||||
// Get text from args
|
||||
split = strsplit(std::move(split[1]), ':', 1);
|
||||
if (split.size() == 2) {
|
||||
text = std::move(split[1]);
|
||||
}
|
||||
if (!split.empty()) {
|
||||
args = std::move(split[0]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void User::parse(Event event) {
|
||||
this->server = std::get<SUID>(event.sender.id);
|
||||
auto split = strsplit(event.args, ' ', 8);
|
||||
// Check size
|
||||
if (split.size() != 9) {
|
||||
throw ParseError("In euid parser: This euid event does not have enough arguments");
|
||||
}
|
||||
// Move values
|
||||
nick = std::move(split[0]);
|
||||
hops = std::stoull(std::move(split[1]));
|
||||
ts = std::stoull(std::move(split[2]));
|
||||
umode = std::move(split[3]);
|
||||
ident = std::move(split[4]);
|
||||
host = std::move(split[5]);
|
||||
realhost = std::move(split[6]);
|
||||
id = UUID(std::move(split[7]));
|
||||
// Get realname
|
||||
realname = std::move(event.text);
|
||||
}
|
||||
|
||||
|
||||
async::result<void> Instance::run() {
|
||||
// Create connection
|
||||
socket = new uvpp::tcp{s};
|
||||
co_await socket->connect(addr);
|
||||
socket->recv_start();
|
||||
|
||||
// Login
|
||||
co_await login();
|
||||
|
||||
// Mainloop
|
||||
while (true) {
|
||||
// Read
|
||||
auto data = co_await socket->recv();
|
||||
// Check for general error
|
||||
if (data->error()) {
|
||||
continue;
|
||||
}
|
||||
// Check for broken connection
|
||||
if (data->broken()) {
|
||||
break;
|
||||
}
|
||||
// Make string
|
||||
auto dataStr = std::string_view{
|
||||
data->data.get(),
|
||||
static_cast<std::string_view::size_type>(data->nread)
|
||||
};
|
||||
// Split by newlines
|
||||
for (auto& line : strsplit(dataStr, '\n')) {
|
||||
if (line.size() < 2) {
|
||||
continue; // Empty line
|
||||
}
|
||||
// Remove \r
|
||||
if (line.back() == '\r') {
|
||||
line.pop_back();
|
||||
}
|
||||
// Check if server sent an event or command, then parse and process it
|
||||
if (line[0] == ':') {
|
||||
Event event;
|
||||
event.parse(std::move(line));
|
||||
std::clog << event.dump() << std::flush;
|
||||
async::detach(process(std::move(event)));
|
||||
} else {
|
||||
Command command;
|
||||
command.parse(std::move(line));
|
||||
std::clog << command.dump() << std::flush;
|
||||
async::detach(process(std::move(command)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async::result<void> Instance::login() {
|
||||
co_await socket->send("PASS {} TS 6 :{}\n"_format(config.auth.send_password, config.server.uid.str()));
|
||||
co_await socket->send("CAPAB :QS EX IE KLN UNKLN ENCAP TB SERVICES EUID EOPMOD MLOCK\n"_sv);
|
||||
co_await socket->send("SERVER {} 1 :{}{}\n"_format(config.server.name, config.server.hidden ? "(H) " : "", config.server.description));
|
||||
co_await socket->send("SVINFO 6 3 0 :{}\n"_format(time(nullptr)));
|
||||
}
|
||||
|
||||
async::result<void> Instance::burst() {
|
||||
// End burst
|
||||
co_await send_ping();
|
||||
client_bursting = false;
|
||||
std::cout << "I'm done bursting too. Ready." << std::endl;
|
||||
}
|
||||
|
||||
async::result<void> Instance::process(const Command command) {
|
||||
if (command.name == "PASS") {
|
||||
// Check password
|
||||
{
|
||||
auto given_password = strsplit(command.args, ' ', 1)[0];
|
||||
if (given_password != config.auth.accept_password) {
|
||||
throw ConnectionError("Server supplied wrong password during authentication");
|
||||
}
|
||||
authed = true;
|
||||
}
|
||||
// Get server ID
|
||||
connected_server.uid = SUID(command.text);
|
||||
} if (!authed) {
|
||||
throw ConnectionError("Server tried to execute a command before authenticating");
|
||||
} else if (command.name == "SERVER") {
|
||||
// Get name and description of connected server
|
||||
connected_server.name = strsplit(command.args, ' ', 1)[0];
|
||||
connected_server.description = command.text;
|
||||
} else if (command.name == "PING") {
|
||||
// End of burst
|
||||
if (server_bursting) {
|
||||
server_bursting = false;
|
||||
std::cout << "Server burst is over. It's my turn." << std::endl;
|
||||
co_await burst();
|
||||
}
|
||||
// Reply
|
||||
co_await socket->send(":{} PONG {} {} :{}\n"_format(config.server.uid.str(), config.server.name, command.args, command.text));
|
||||
}
|
||||
}
|
||||
|
||||
async::result<void> Instance::process(const Event event) {
|
||||
if (event.name == "NOTICE") {
|
||||
// Don't do anything special
|
||||
} else if (!authed) {
|
||||
throw ConnectionError("Server tried to send an event before authenticating");
|
||||
} else if (event.name == "EUID") {
|
||||
User user;
|
||||
user.parse(event);
|
||||
std::cout << "User registered: " << user.dump().dump() << std::flush;
|
||||
users[user.id.str()] = std::move(user);
|
||||
}
|
||||
co_return;
|
||||
}
|
||||
|
||||
async::result<void> Instance::send_ping() {
|
||||
co_await socket->send("PING :{}\n"_format(connected_server.uid.str()));
|
||||
}
|
96
instance.hpp
Normal file
96
instance.hpp
Normal file
|
@ -0,0 +1,96 @@
|
|||
#ifndef _INSTANCE_HPP
|
||||
#define _INSTANCE_HPP
|
||||
#include "config.hpp"
|
||||
|
||||
#include <uvpp.hpp>
|
||||
#include <async/result.hpp>
|
||||
#include <fmt/format.h>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <unordered_map>
|
||||
#include <stdexcept>
|
||||
#include <ctime>
|
||||
|
||||
|
||||
|
||||
struct ParseError : public std::runtime_error {
|
||||
using std::runtime_error::runtime_error;
|
||||
};
|
||||
struct ConnectionError : public std::runtime_error {
|
||||
using std::runtime_error::runtime_error;
|
||||
};
|
||||
|
||||
struct Event {
|
||||
AnyUID sender;
|
||||
std::string name, args, text;
|
||||
|
||||
std::string dump() const {
|
||||
return fmt::format(":{} {} {}{}\n", sender.str(), name, args, (text.empty()?"":":"+text));
|
||||
}
|
||||
void parse(std::string_view str);
|
||||
};
|
||||
|
||||
struct Command {
|
||||
std::string name, args, text;
|
||||
|
||||
std::string dump() const {
|
||||
return fmt::format("{} {}{}\n", name, args, (text.empty()?"":":"+text));
|
||||
}
|
||||
void parse(std::string_view str);
|
||||
};
|
||||
|
||||
struct User {
|
||||
SUID server;
|
||||
// ... == "EUID"
|
||||
std::string nick;
|
||||
size_t hops;
|
||||
time_t ts;
|
||||
std::string umode;
|
||||
std::string ident;
|
||||
std::string host;
|
||||
std::string realhost;
|
||||
UUID id;
|
||||
std::string realname;
|
||||
|
||||
User() {
|
||||
ts = time(nullptr);
|
||||
}
|
||||
|
||||
Event dump() const {
|
||||
return Event{
|
||||
.sender = SUID(server),
|
||||
.name = "EUID",
|
||||
.args = fmt::format("{} 1 {} {} {} {} 0 {} * * :{}", nick, ts, umode, ident, host, id.str(), realname)
|
||||
};
|
||||
}
|
||||
void parse(Event event);
|
||||
};
|
||||
|
||||
class Instance {
|
||||
uvpp::loop_service &s;
|
||||
const Config& config;
|
||||
uvpp::Addr addr;
|
||||
uvpp::tcp *socket = nullptr;
|
||||
Config::Server connected_server;
|
||||
|
||||
bool server_bursting = true, client_bursting = true;
|
||||
bool authed = false;
|
||||
std::unordered_map<std::string_view, User> users;
|
||||
|
||||
public:
|
||||
Instance(uvpp::loop_service &s, const Config& config) : s(s), config(config) {
|
||||
addr = uvpp::make_ipv4(config.connection.addr, config.connection.port);
|
||||
}
|
||||
~Instance() {
|
||||
if (socket) delete socket;
|
||||
}
|
||||
|
||||
async::result<void> run();
|
||||
async::result<void> login();
|
||||
async::result<void> burst();
|
||||
async::result<void> process(const Command);
|
||||
async::result<void> process(const Event);
|
||||
|
||||
async::result<void> send_ping();
|
||||
};
|
||||
#endif
|
23
main.cpp
Normal file
23
main.cpp
Normal file
|
@ -0,0 +1,23 @@
|
|||
#include "config.hpp"
|
||||
#include "instance.hpp"
|
||||
|
||||
#include <uvpp.hpp>
|
||||
#include <async/result.hpp>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
using namespace std;
|
||||
|
||||
|
||||
|
||||
int main() {
|
||||
using namespace uvpp;
|
||||
async::run_queue rq;
|
||||
async::queue_scope qs{&rq};
|
||||
loop_service service;
|
||||
|
||||
Instance instance(service, config);
|
||||
|
||||
async::detach(instance.run());
|
||||
async::run_forever(rq.run_token(), loop_service_wrapper{service});
|
||||
}
|
88
uid.hpp
Normal file
88
uid.hpp
Normal file
|
@ -0,0 +1,88 @@
|
|||
#ifndef _UID_HPP
|
||||
#define _UID_HPP
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <array>
|
||||
#include <variant>
|
||||
|
||||
|
||||
|
||||
template<int len>
|
||||
class UID {
|
||||
public:
|
||||
std::array<char, len> array;
|
||||
|
||||
constexpr UID() : array({'\0'}) {}
|
||||
constexpr UID(std::string_view initializer) {
|
||||
for (typeof(len) it = 0; it != len; it++) {
|
||||
array[it] = *(initializer.begin() + it);
|
||||
}
|
||||
//array[len] = '\0';
|
||||
}
|
||||
constexpr UID(const char *initializer) {
|
||||
*this = UID(std::string_view{initializer, len});
|
||||
}
|
||||
|
||||
constexpr bool has_value() const {
|
||||
return array[0] != '\0';
|
||||
}
|
||||
constexpr std::string_view str() const {
|
||||
if (has_value()) {
|
||||
return {array.begin(), static_cast<std::string_view::size_type>(len)};
|
||||
} else {
|
||||
return "NUL_V";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
constexpr int SUID_len = 3;
|
||||
constexpr int UUID_len = 9;
|
||||
using SUID = UID<SUID_len>;
|
||||
using UUID = UID<UUID_len>;
|
||||
|
||||
|
||||
struct AnyUID {
|
||||
std::variant<SUID, UUID, std::string, std::nullptr_t> id;
|
||||
enum Type {
|
||||
USER,
|
||||
SERVER,
|
||||
OTHER,
|
||||
NUL
|
||||
} type = NUL;
|
||||
|
||||
std::string_view str() const {
|
||||
if (type == SERVER) {
|
||||
return std::get<SUID>(id).str();
|
||||
} else if (type == USER) {
|
||||
return std::get<UUID>(id).str();
|
||||
} else if (type == OTHER) {
|
||||
return std::get<std::string>(id);
|
||||
} else {
|
||||
return "NUL_T";
|
||||
}
|
||||
}
|
||||
|
||||
auto operator =(const SUID& val) {
|
||||
type = SERVER;
|
||||
id = val;
|
||||
}
|
||||
auto operator =(const UUID& val) {
|
||||
type = USER;
|
||||
id = val;
|
||||
}
|
||||
auto operator =(const std::string& val) {
|
||||
type = OTHER;
|
||||
id = std::string(val);
|
||||
}
|
||||
auto operator =(std::nullptr_t) {
|
||||
type = NUL;
|
||||
id = nullptr;
|
||||
}
|
||||
|
||||
AnyUID() {}
|
||||
template<typename T>
|
||||
AnyUID(const T& val) {
|
||||
*this = val;
|
||||
}
|
||||
};
|
||||
#endif
|
Loading…
Add table
Reference in a new issue