Changeset 27106
- Timestamp:
- Oct 4, 2022, 9:08:39 PM (22 months ago)
- Location:
- ps/trunk/source
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
ps/trunk/source/main.cpp
r26879 r27106 109 109 // See: 110 110 // - 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/ 113 113 extern "C" 114 114 { … … 497 497 // moved into a helper function to ensure args is destroyed before 498 498 // exit(), which may result in a memory leak. 499 static void RunGameOrAtlas( int argc, const char* argv[])500 { 501 CmdLineArgs args(argc,argv);499 static void RunGameOrAtlas() 500 { 501 argv); 502 502 503 503 g_CmdLineArgs = args; … … 737 737 EarlyInit(); // must come at beginning of main 738 738 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)}); 740 741 741 742 // Shut down profiler initialised by EarlyInit -
ps/trunk/source/ps/CStr.h
r26023 r27106 1 /* Copyright (C) 202 1Wildfire Games.1 /* Copyright (C) 202 Wildfire Games. 2 2 * This file is part of 0 A.D. 3 3 * … … 64 64 using Char = typename std::tstring::value_type; 65 65 66 CStr() {}67 CStr(const Char* str) : StrBase(str) {}68 CStr(const Char* str, size_t len) : StrBase(str, len) {}69 66 CStr(const StrBase& str) : StrBase(str) {} 70 template<class InputIterator> 71 CStr (InputIterator first, InputIterator last) : StrBase(first, last) {}67 68 72 69 73 70 /** -
ps/trunk/source/ps/GameSetup/CmdLineArgs.cpp
r25446 r27106 1 /* Copyright (C) 202 1Wildfire Games.1 /* Copyright (C) 202 Wildfire Games. 2 2 * This file is part of 0 A.D. 3 3 * … … 20 20 21 21 #include "lib/sysdep/sysdep.h" 22 23 24 25 22 26 23 27 CmdLineArgs g_CmdLineArgs; … … 43 47 } // namespace 44 48 45 CmdLineArgs::CmdLineArgs( int argc, const char* argv[])49 CmdLineArgs::CmdLineArgs() 46 50 { 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; 55 53 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)) 57 62 { 58 63 // Only accept arguments that start with '-' 59 if (arg v[i][0] != '-')64 if (arg[0] != '-') 60 65 { 61 m_ArgsWithoutName.emplace_back(arg v[i]);66 m_ArgsWithoutName.emplace_back(arg); 62 67 continue; 63 68 } 64 69 65 70 // 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); 68 72 69 73 // 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(), '='); 78 76 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)); 80 80 } 81 81 } -
ps/trunk/source/ps/GameSetup/CmdLineArgs.h
r25474 r27106 1 /* Copyright (C) 202 1Wildfire Games.1 /* Copyright (C) 202 Wildfire Games. 2 2 * This file is part of 0 A.D. 3 3 * … … 19 19 #define INCLUDED_CMDLINEARGS 20 20 21 22 21 23 #include "ps/CStr.h" 22 #include "lib/os_path.h"23 24 25 24 26 #include <vector> 25 27 … … 34 36 * <tt>-name=value</tt> - anything else is ignored. 35 37 * 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 38 39 */ 39 CmdLineArgs( int argc, const char* argv[]);40 CmdLineArgs(); 40 41 41 42 /** -
ps/trunk/source/ps/GameSetup/tests/test_CmdLineArgs.h
r21726 r27106 1 /* Copyright (C) 20 18Wildfire Games.1 /* Copyright (C) 20 Wildfire Games. 2 2 * This file is part of 0 A.D. 3 3 * … … 20 20 #include "ps/GameSetup/CmdLineArgs.h" 21 21 22 23 22 24 class TestCmdLineArgs : public CxxTest::TestSuite 23 25 { … … 25 27 void test_has() 26 28 { 27 const char* argv[]= { "program", "-test2" };28 CmdLineArgs c( ARRAY_SIZE(argv),argv);29 const = { "program", "-test2" }; 30 CmdLineArgs c(argv); 29 31 TS_ASSERT(!c.Has("test1")); 30 32 TS_ASSERT(c.Has("test2")); … … 35 37 void test_get() 36 38 { 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); 39 44 TS_ASSERT(!c.Has("program")); 40 45 TS_ASSERT_STR_EQUALS(c.Get("test0"), ""); … … 47 52 void test_multiple() 48 53 { 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); 51 59 52 60 TS_ASSERT_STR_EQUALS(c.Get("test1"), "one"); … … 67 75 void test_get_invalid() 68 76 { 69 const char* argv[]= {77 const = { 70 78 "-test1", "--test2", "test3-", " -test4", "--", "-==" 71 79 }; 72 CmdLineArgs c( ARRAY_SIZE(argv),argv);80 CmdLineArgs c(argv); 73 81 74 82 TS_ASSERT(!c.Has("test1")); … … 80 88 void test_arg0() 81 89 { 82 const char* argv[]= { "program" };83 CmdLineArgs c( ARRAY_SIZE(argv),argv);90 const = { "program" }; 91 CmdLineArgs c(argv); 84 92 TS_ASSERT_WSTR_EQUALS(c.GetArg0().string(), L"program"); 85 93 86 CmdLineArgs c2( 0, NULL);94 CmdLineArgs c2(); 87 95 TS_ASSERT_WSTR_EQUALS(c2.GetArg0().string(), L""); 88 96 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); 91 99 #if OS_WIN 92 100 TS_ASSERT_WSTR_EQUALS(c3.GetArg0().string(), L"ab\\cd\\ef\\gh\\..\\ij"); … … 98 106 void test_get_without_names() 99 107 { 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); 102 113 TS_ASSERT(c.Has("test1")); 103 114 TS_ASSERT_STR_EQUALS(c.Get("test4"), "test5"); -
ps/trunk/source/ps/containers/Span.h
r26848 r27106 39 39 using element_type = T; 40 40 using value_type = std::remove_cv_t<T>; 41 using size_type = s td::size_t;41 using size_type = size_t; 42 42 using pointer = T*; 43 43 using reference = T&; … … 52 52 constexpr span(iterator first, iterator last) 53 53 : m_Pointer(first), m_Extent(static_cast<size_type>(last - first)) {} 54 55 56 57 54 58 55 59 constexpr span(const span& other) = default; … … 67 71 constexpr iterator end() const { return m_Pointer + m_Extent; } 68 72 73 74 69 75 private: 70 76 pointer m_Pointer; … … 72 78 }; 73 79 80 81 82 74 83 } // namespace PS 75 84
Note:
See TracChangeset
for help on using the changeset viewer.