Changeset 27106

Timestamp:
Oct 4, 2022, 9:08:39 PM (22 months ago)
Author:
Vladislav Belov
Message:

Adds PS::span and std::string_view to CmdLineArgs.

Patch By: phosit

Differential Revision: https://code.wildfiregames.com/D4677

Location:
ps/trunk/source
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • ps/trunk/source/main.cpp

    r26879 r27106  
    109109// See:
    110110// - https://github.com/supertuxkart/stk-code/pull/4693/commits/0a99c667ef513b2ce0f5755729a6e05df8aac48a
    111 // - https://docs.nvidia.com/gameworks/content/technologies/desktop/optimus.htm 
    112 // - https://gpuopen.com/learn/amdpowerxpressrequesthighperformance/ 
     111// - https://docs.nvidia.com/gameworks/content/technologies/desktop/optimus.htm
     112// - https://gpuopen.com/learn/amdpowerxpressrequesthighperformance/
    113113extern "C"
    114114{
     
    497497// moved into a helper function to ensure args is destroyed before
    498498// exit(), which may result in a memory leak.
    499 static void RunGameOrAtlas(int argc, const char* argv[])
    500 {
    501     CmdLineArgs args(argc, argv);
     499static void RunGameOrAtlas()
     500{
     501    argv);
    502502
    503503    g_CmdLineArgs = args;
     
    737737    EarlyInit();    // must come at beginning of main
    738738
    739     RunGameOrAtlas(argc, const_cast<const char**>(argv));
     739    // static_cast is ok, argc is never negative.
     740    RunGameOrAtlas({argv, static_cast<std::size_t>(argc)});
    740741
    741742    // Shut down profiler initialised by EarlyInit
  • ps/trunk/source/ps/CStr.h

    r26023 r27106  
    1 /* Copyright (C) 2021 Wildfire Games.
     1/* Copyright (C) 202 Wildfire Games.
    22 * This file is part of 0 A.D.
    33 *
     
    6464    using Char = typename std::tstring::value_type;
    6565
    66     CStr() {}
    67     CStr(const Char* str) : StrBase(str) {}
    68     CStr(const Char* str, size_t len) : StrBase(str, len) {}
    6966    CStr(const StrBase& str) : StrBase(str) {}
    70     template<class InputIterator>
    71     CStr (InputIterator first, InputIterator last) : StrBase(first, last) {}
     67
     68   
    7269
    7370    /**
  • ps/trunk/source/ps/GameSetup/CmdLineArgs.cpp

    r25446 r27106  
    1 /* Copyright (C) 2021 Wildfire Games.
     1/* Copyright (C) 202 Wildfire Games.
    22 * This file is part of 0 A.D.
    33 *
     
    2020
    2121#include "lib/sysdep/sysdep.h"
     22
     23
     24
     25
    2226
    2327CmdLineArgs g_CmdLineArgs;
     
    4347} // namespace
    4448
    45 CmdLineArgs::CmdLineArgs(int argc, const char* argv[])
     49CmdLineArgs::CmdLineArgs()
    4650{
    47     if (argc >= 1)
    48     {
    49         std::string arg0(argv[0]);
    50         // avoid OsPath complaining about mixing both types of separators,
    51         // which happens when running in the VC2010 debugger
    52         std::replace(arg0.begin(), arg0.end(), '/', SYS_DIR_SEP);
    53         m_Arg0 = arg0;
    54     }
     51    if (argv.empty())
     52        return;
    5553
    56     for (int i = 1; i < argc; ++i)
     54    std::string arg0(argv[0]);
     55    // avoid OsPath complaining about mixing both types of separators,
     56    // which happens when running in the VC2010 debugger
     57    std::replace(arg0.begin(), arg0.end(), '/', SYS_DIR_SEP);
     58    m_Arg0 = arg0;
     59
     60    // Implicit conversion from const char* to std::string_view.
     61    for (const std::string_view arg : argv.subspan(1))
    5762    {
    5863        // Only accept arguments that start with '-'
    59         if (argv[i][0] != '-')
     64        if (arg[0] != '-')
    6065        {
    61             m_ArgsWithoutName.emplace_back(argv[i]);
     66            m_ArgsWithoutName.emplace_back(arg);
    6267            continue;
    6368        }
    6469
    6570        // Allow -arg and --arg
    66         char offset = argv[i][1] == '-' ? 2 : 1;
    67         CStr name, value;
     71        const std::string_view afterDashes = arg.substr(arg[1] == '-' ? 2 : 1);
    6872
    6973        // Check for "-arg=value"
    70         const char* eq = strchr(argv[i], '=');
    71         if (eq)
    72         {
    73             name = CStr(argv[i]+offset, eq-argv[i]-offset);
    74             value = CStr(eq+1);
    75         }
    76         else
    77             name = CStr(argv[i]+offset);
     74        const std::string_view::iterator eq =
     75            std::find(afterDashes.begin(), afterDashes.end(), '=');
    7876
    79         m_Args.emplace_back(std::move(name), std::move(value));
     77        CStr value = (eq != afterDashes.end()) ? CStr{eq + 1, afterDashes.end()} : CStr{};
     78
     79        m_Args.emplace_back(CStr(afterDashes.begin(), eq), std::move(value));
    8080    }
    8181}
  • ps/trunk/source/ps/GameSetup/CmdLineArgs.h

    r25474 r27106  
    1 /* Copyright (C) 2021 Wildfire Games.
     1/* Copyright (C) 202 Wildfire Games.
    22 * This file is part of 0 A.D.
    33 *
     
    1919#define INCLUDED_CMDLINEARGS
    2020
     21
     22
    2123#include "ps/CStr.h"
    22 #include "lib/os_path.h"
    2324
     25
    2426#include <vector>
    2527
     
    3436     * <tt>-name=value</tt> - anything else is ignored.
    3537     *
    36      * @param argc size of argv array
    37      * @param argv array of arguments; argv[0] should be the program's name
     38     * @param argv span of arguments; argv[0] should be the program's name
    3839     */
    39     CmdLineArgs(int argc, const char* argv[]);
     40    CmdLineArgs();
    4041
    4142    /**
  • ps/trunk/source/ps/GameSetup/tests/test_CmdLineArgs.h

    r21726 r27106  
    1 /* Copyright (C) 2018 Wildfire Games.
     1/* Copyright (C) 20 Wildfire Games.
    22 * This file is part of 0 A.D.
    33 *
     
    2020#include "ps/GameSetup/CmdLineArgs.h"
    2121
     22
     23
    2224class TestCmdLineArgs : public CxxTest::TestSuite
    2325{
     
    2527    void test_has()
    2628    {
    27         const char* argv[] = { "program", "-test2" };
    28         CmdLineArgs c(ARRAY_SIZE(argv), argv);
     29        const = { "program", "-test2" };
     30        CmdLineArgs c(argv);
    2931        TS_ASSERT(!c.Has("test1"));
    3032        TS_ASSERT(c.Has("test2"));
     
    3537    void test_get()
    3638    {
    37         const char* argv[] = { "program", "-test1=", "--test2=x", "-test3=-y=y-", "-=z" };
    38         CmdLineArgs c(ARRAY_SIZE(argv), argv);
     39        constexpr std::array<const char*, 5> argv =
     40        {
     41            "program", "-test1=", "--test2=x", "-test3=-y=y-", "-=z"
     42        };
     43        CmdLineArgs c(argv);
    3944        TS_ASSERT(!c.Has("program"));
    4045        TS_ASSERT_STR_EQUALS(c.Get("test0"), "");
     
    4752    void test_multiple()
    4853    {
    49         const char* argv[] = { "program", "-test1=one", "--test1=two", "-test2=none", "-test1=three" };
    50         CmdLineArgs c(ARRAY_SIZE(argv), argv);
     54        constexpr std::array<const char*, 5> argv =
     55        {
     56            "program", "-test1=one", "--test1=two", "-test2=none", "-test1=three"
     57        };
     58        CmdLineArgs c(argv);
    5159
    5260        TS_ASSERT_STR_EQUALS(c.Get("test1"), "one");
     
    6775    void test_get_invalid()
    6876    {
    69         const char* argv[] = {
     77        const = {
    7078            "-test1", "--test2", "test3-", " -test4", "--", "-=="
    7179        };
    72         CmdLineArgs c(ARRAY_SIZE(argv), argv);
     80        CmdLineArgs c(argv);
    7381
    7482        TS_ASSERT(!c.Has("test1"));
     
    8088    void test_arg0()
    8189    {
    82         const char* argv[] = { "program" };
    83         CmdLineArgs c(ARRAY_SIZE(argv), argv);
     90        const = { "program" };
     91        CmdLineArgs c(argv);
    8492        TS_ASSERT_WSTR_EQUALS(c.GetArg0().string(), L"program");
    8593
    86         CmdLineArgs c2(0, NULL);
     94        CmdLineArgs c2();
    8795        TS_ASSERT_WSTR_EQUALS(c2.GetArg0().string(), L"");
    8896
    89         const char* argv3[] = { "ab/cd/ef/gh/../ij" };
    90         CmdLineArgs c3(ARRAY_SIZE(argv3), argv3);
     97        const = { "ab/cd/ef/gh/../ij" };
     98        CmdLineArgs c3(argv3);
    9199#if OS_WIN
    92100        TS_ASSERT_WSTR_EQUALS(c3.GetArg0().string(), L"ab\\cd\\ef\\gh\\..\\ij");
     
    98106    void test_get_without_names()
    99107    {
    100         const char* argv[] = { "program", "test0", "-test1", "test2", "test3", "--test4=test5" };
    101         CmdLineArgs c(ARRAY_SIZE(argv), argv);
     108        constexpr std::array<const char*, 6> argv =
     109        {
     110            "program", "test0", "-test1", "test2", "test3", "--test4=test5"
     111        };
     112        CmdLineArgs c(argv);
    102113        TS_ASSERT(c.Has("test1"));
    103114        TS_ASSERT_STR_EQUALS(c.Get("test4"), "test5");
  • ps/trunk/source/ps/containers/Span.h

    r26848 r27106  
    3939    using element_type = T;
    4040    using value_type = std::remove_cv_t<T>;
    41     using size_type = std::size_t;
     41    using size_type = size_t;
    4242    using pointer = T*;
    4343    using reference = T&;
     
    5252    constexpr span(iterator first, iterator last)
    5353        : m_Pointer(first), m_Extent(static_cast<size_type>(last - first)) {}
     54
     55
     56
     57
    5458
    5559    constexpr span(const span& other) = default;
     
    6771    constexpr iterator end() const { return m_Pointer + m_Extent; }
    6872
     73
     74
    6975private:
    7076    pointer m_Pointer;
     
    7278};
    7379
     80
     81
     82
    7483} // namespace PS
    7584
Note: See TracChangeset for help on using the changeset viewer.