From 44e31c296b58b1160670e694962179c654fe0b53 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Sat, 19 Aug 2023 16:35:17 +0900 Subject: [PATCH] Switch to C++20 --- .github/workflows/Linux_aarch64.yml | 10 ++++-- .github/workflows/Linux_x86.yml | 10 ++++-- .github/workflows/Linux_x86_64.yml | 2 +- .github/workflows/Linux_x86_64_test.yml | 2 +- CMakeLists.txt | 5 +-- Source/towners.cpp | 43 +++++++++---------------- Source/towners.h | 4 +-- 7 files changed, 36 insertions(+), 40 deletions(-) diff --git a/.github/workflows/Linux_aarch64.yml b/.github/workflows/Linux_aarch64.yml index 25f7c2ba620b..f621a519d6d6 100644 --- a/.github/workflows/Linux_aarch64.yml +++ b/.github/workflows/Linux_aarch64.yml @@ -36,12 +36,18 @@ jobs: sudo apt-get -y install --allow-downgrades libpcre2-8-0=10.34-7 Packaging/nix/debian-cross-aarch64-prep.sh + - name: Install GCC + run: | + sudo add-apt-repository ppa:ubuntu-toolchain-r/test + DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends gcc-13 g++13 + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 13 --slave /usr/bin/g++ g++ /usr/bin/g++-13 + - name: Cache CMake build folder uses: actions/cache@v3 with: path: build - key: ${{ github.workflow }}-v2-${{ github.sha }} - restore-keys: ${{ github.workflow }}-v2- + key: ${{ github.workflow }}-v4-${{ github.sha }} + restore-keys: ${{ github.workflow }}-v4- - name: Build working-directory: ${{github.workspace}} diff --git a/.github/workflows/Linux_x86.yml b/.github/workflows/Linux_x86.yml index 2b2905b070c1..d36e9a59054d 100644 --- a/.github/workflows/Linux_x86.yml +++ b/.github/workflows/Linux_x86.yml @@ -36,12 +36,18 @@ jobs: sudo apt-get -y install --allow-downgrades libpcre2-8-0=10.34-7 Packaging/nix/debian-cross-i386-prep.sh + - name: Install GCC + run: | + sudo add-apt-repository ppa:ubuntu-toolchain-r/test + DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends gcc-13 g++13 + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 13 --slave /usr/bin/g++ g++ /usr/bin/g++-13 + - name: Cache CMake build folder uses: actions/cache@v3 with: path: build - key: ${{ github.workflow }}-v3-${{ github.sha }} - restore-keys: ${{ github.workflow }}-v3- + key: ${{ github.workflow }}-v5-${{ github.sha }} + restore-keys: ${{ github.workflow }}-v5- - name: Build working-directory: ${{github.workspace}} diff --git a/.github/workflows/Linux_x86_64.yml b/.github/workflows/Linux_x86_64.yml index ae064ea795fc..e3e9aaed664e 100644 --- a/.github/workflows/Linux_x86_64.yml +++ b/.github/workflows/Linux_x86_64.yml @@ -22,7 +22,7 @@ concurrency: jobs: build: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 diff --git a/.github/workflows/Linux_x86_64_test.yml b/.github/workflows/Linux_x86_64_test.yml index 227006231681..cb693cec3349 100644 --- a/.github/workflows/Linux_x86_64_test.yml +++ b/.github/workflows/Linux_x86_64_test.yml @@ -18,7 +18,7 @@ concurrency: jobs: build: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 diff --git a/CMakeLists.txt b/CMakeLists.txt index 67b069f70e7e..3fe9f51d909e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -293,12 +293,9 @@ if(GPERF) endif() endif() -# Despite setting C++ standard to 20, features from this version are not being used. -# DevilutionX is compatible with C++ 17. -# Here we set it to 20 only to take advantage of the fmt::format build time errors. set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_EXTENSIONS OFF) -set(CMAKE_CXX_STANDARD_REQUIRED OFF) +set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # for clang-tidy set(CMAKE_THREAD_PREFER_PTHREAD ON) set(THREADS_PREFER_PTHREAD_FLAG ON) diff --git a/Source/towners.cpp b/Source/towners.cpp index 37cd6779abc9..62b1a3f40b0f 100644 --- a/Source/towners.cpp +++ b/Source/towners.cpp @@ -77,8 +77,7 @@ void InitSmith(Towner &towner, const TownerData &townerData) 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 // clang-format on }; - towner.animOrder = AnimOrder; - towner.animOrderSize = sizeof(AnimOrder); + towner.animOrder = { AnimOrder }; LoadTownerAnimations(towner, "towners\\smith\\smithn", 16, 3); towner.name = _("Griswold the Blacksmith"); towner.gossip = PickRandomlyAmong({ TEXT_GRISWOLD2, TEXT_GRISWOLD3, TEXT_GRISWOLD4, TEXT_GRISWOLD5, TEXT_GRISWOLD6, TEXT_GRISWOLD7, TEXT_GRISWOLD8, TEXT_GRISWOLD9, TEXT_GRISWOLD10, TEXT_GRISWOLD12, TEXT_GRISWOLD13 }); @@ -100,8 +99,7 @@ void InitBarOwner(Towner &towner, const TownerData &townerData) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 // clang-format on }; - towner.animOrder = AnimOrder; - towner.animOrderSize = sizeof(AnimOrder); + towner.animOrder = { AnimOrder }; LoadTownerAnimations(towner, "towners\\twnf\\twnfn", 16, 3); towner.name = _("Ogden the Tavern owner"); towner.gossip = PickRandomlyAmong({ TEXT_OGDEN2, TEXT_OGDEN3, TEXT_OGDEN4, TEXT_OGDEN5, TEXT_OGDEN6, TEXT_OGDEN8, TEXT_OGDEN9, TEXT_OGDEN10 }); @@ -110,8 +108,7 @@ void InitBarOwner(Towner &towner, const TownerData &townerData) void InitTownDead(Towner &towner, const TownerData &townerData) { towner._tAnimWidth = 96; - towner.animOrder = nullptr; - towner.animOrderSize = 0; + towner.animOrder = {}; LoadTownerAnimations(towner, "towners\\butch\\deadguy", 8, 6); towner.name = _("Wounded Townsman"); } @@ -132,8 +129,7 @@ void InitWitch(Towner &towner, const TownerData &townerData) 0, 1, 0, 18, 17, 18, 0, 1, 0, 1, 2 // clang-format on }; - towner.animOrder = AnimOrder; - towner.animOrderSize = sizeof(AnimOrder); + towner.animOrder = { AnimOrder }; LoadTownerAnimations(towner, "towners\\townwmn1\\witch", 19, 6); towner.name = _("Adria the Witch"); towner.gossip = PickRandomlyAmong({ TEXT_ADRIA2, TEXT_ADRIA3, TEXT_ADRIA4, TEXT_ADRIA5, TEXT_ADRIA6, TEXT_ADRIA7, TEXT_ADRIA8, TEXT_ADRIA9, TEXT_ADRIA10, TEXT_ADRIA12, TEXT_ADRIA13 }); @@ -142,8 +138,7 @@ void InitWitch(Towner &towner, const TownerData &townerData) void InitBarmaid(Towner &towner, const TownerData &townerData) { towner._tAnimWidth = 96; - towner.animOrder = nullptr; - towner.animOrderSize = 0; + towner.animOrder = {}; LoadTownerAnimations(towner, "towners\\townwmn1\\wmnn", 18, 6); towner.name = _("Gillian the Barmaid"); towner.gossip = PickRandomlyAmong({ TEXT_GILLIAN2, TEXT_GILLIAN3, TEXT_GILLIAN4, TEXT_GILLIAN5, TEXT_GILLIAN6, TEXT_GILLIAN7, TEXT_GILLIAN9, TEXT_GILLIAN10 }); @@ -152,8 +147,7 @@ void InitBarmaid(Towner &towner, const TownerData &townerData) void InitBoy(Towner &towner, const TownerData &townerData) { towner._tAnimWidth = 96; - towner.animOrder = nullptr; - towner.animOrderSize = 0; + towner.animOrder = {}; LoadTownerAnimations(towner, "towners\\townboy\\pegkid1", 20, 6); towner.name = _("Wirt the Peg-legged boy"); towner.gossip = PickRandomlyAmong({ TEXT_WIRT2, TEXT_WIRT3, TEXT_WIRT4, TEXT_WIRT5, TEXT_WIRT6, TEXT_WIRT7, TEXT_WIRT8, TEXT_WIRT9, TEXT_WIRT11, TEXT_WIRT12 }); @@ -175,8 +169,7 @@ void InitHealer(Towner &towner, const TownerData &townerData) 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 // clang-format on }; - towner.animOrder = AnimOrder; - towner.animOrderSize = sizeof(AnimOrder); + towner.animOrder = { AnimOrder }; LoadTownerAnimations(towner, "towners\\healer\\healer", 20, 6); towner.name = _("Pepin the Healer"); towner.gossip = PickRandomlyAmong({ TEXT_PEPIN2, TEXT_PEPIN3, TEXT_PEPIN4, TEXT_PEPIN5, TEXT_PEPIN6, TEXT_PEPIN7, TEXT_PEPIN9, TEXT_PEPIN10, TEXT_PEPIN11 }); @@ -193,8 +186,7 @@ void InitTeller(Towner &towner, const TownerData &townerData) 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 // clang-format on }; - towner.animOrder = AnimOrder; - towner.animOrderSize = sizeof(AnimOrder); + towner.animOrder = { AnimOrder }; LoadTownerAnimations(towner, "towners\\strytell\\strytell", 25, 3); towner.name = _("Cain the Elder"); towner.gossip = PickRandomlyAmong({ TEXT_STORY2, TEXT_STORY3, TEXT_STORY4, TEXT_STORY5, TEXT_STORY6, TEXT_STORY7, TEXT_STORY9, TEXT_STORY10, TEXT_STORY11 }); @@ -210,8 +202,7 @@ void InitDrunk(Towner &towner, const TownerData &townerData) 0, 1, 2, 3, 4, 4, 4, 3, 2, 1 // clang-format on }; - towner.animOrder = AnimOrder; - towner.animOrderSize = sizeof(AnimOrder); + towner.animOrder = { AnimOrder }; LoadTownerAnimations(towner, "towners\\drunk\\twndrunk", 18, 3); towner.name = _("Farnham the Drunk"); towner.gossip = PickRandomlyAmong({ TEXT_FARNHAM2, TEXT_FARNHAM3, TEXT_FARNHAM4, TEXT_FARNHAM5, TEXT_FARNHAM6, TEXT_FARNHAM8, TEXT_FARNHAM9, TEXT_FARNHAM10, TEXT_FARNHAM11, TEXT_FARNHAM12, TEXT_FARNHAM13 }); @@ -220,8 +211,7 @@ void InitDrunk(Towner &towner, const TownerData &townerData) void InitCows(Towner &towner, const TownerData &townerData) { towner._tAnimWidth = 128; - towner.animOrder = nullptr; - towner.animOrderSize = 0; + towner.animOrder = {}; NewTownerAnim(towner, (*CowSprites)[static_cast(townerData.dir)], 12, 3); towner._tAnimFrame = GenerateRnd(11); @@ -246,8 +236,7 @@ void InitCows(Towner &towner, const TownerData &townerData) void InitFarmer(Towner &towner, const TownerData &townerData) { towner._tAnimWidth = 96; - towner.animOrder = nullptr; - towner.animOrderSize = 0; + towner.animOrder = {}; LoadTownerAnimations(towner, "towners\\farmer\\farmrn2", 15, 3); towner.name = _("Lester the farmer"); } @@ -259,8 +248,7 @@ void InitCowFarmer(Towner &towner, const TownerData &townerData) celPath = "towners\\farmer\\mfrmrn2"; } towner._tAnimWidth = 96; - towner.animOrder = nullptr; - towner.animOrderSize = 0; + towner.animOrder = {}; LoadTownerAnimations(towner, celPath, 15, 3); towner.name = _("Complete Nut"); } @@ -268,8 +256,7 @@ void InitCowFarmer(Towner &towner, const TownerData &townerData) void InitGirl(Towner &towner, const TownerData &townerData) { towner._tAnimWidth = 96; - towner.animOrder = nullptr; - towner.animOrderSize = 0; + towner.animOrder = {}; LoadTownerAnimations(towner, "towners\\girl\\girlw1", 20, 6); towner.name = _("Celia"); } @@ -887,9 +874,9 @@ void ProcessTowners() towner._tAnimCnt = 0; - if (towner.animOrderSize > 0) { + if (!towner.animOrder.empty()) { towner._tAnimFrameCnt++; - if (towner._tAnimFrameCnt > towner.animOrderSize - 1) + if (towner._tAnimFrameCnt > towner.animOrder.size() - 1) towner._tAnimFrameCnt = 0; towner._tAnimFrame = towner.animOrder[towner._tAnimFrameCnt]; diff --git a/Source/towners.h b/Source/towners.h index 229cb7d72ee8..dc5041748edb 100644 --- a/Source/towners.h +++ b/Source/towners.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include "items.h" @@ -39,7 +40,7 @@ struct Towner { OptionalOwnedClxSpriteList ownedAnim; OptionalClxSpriteList anim; /** Specifies the animation frame sequence. */ - const uint8_t *animOrder; // unowned + std::span animOrder; void (*talk)(Player &player, Towner &towner); std::string_view name; @@ -58,7 +59,6 @@ struct Towner { /** Current frame of animation. */ uint8_t _tAnimFrame; uint8_t _tAnimFrameCnt; - uint8_t animOrderSize; _talker_id _ttype; [[nodiscard]] ClxSprite currentSprite() const