Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-01-08 10:09:16

0001 // Copyright (c) 2017-2025, University of Cincinnati, developed by Henry Schreiner
0002 // under NSF AWARD 1414736 and by the respective contributors.
0003 // All rights reserved.
0004 //
0005 // SPDX-License-Identifier: BSD-3-Clause
0006 
0007 #pragma once
0008 
0009 // IWYU pragma: private, include "CLI/CLI.hpp"
0010 
0011 // This include is only needed for IDEs to discover symbols
0012 #include "../Argv.hpp"
0013 
0014 #include "../Encoding.hpp"
0015 
0016 // [CLI11:public_includes:set]
0017 #include <algorithm>
0018 #include <memory>
0019 #include <stdexcept>
0020 #include <string>
0021 #include <vector>
0022 // [CLI11:public_includes:end]
0023 
0024 // [CLI11:argv_inl_includes:verbatim]
0025 #if defined(_WIN32)
0026 #if !(defined(_AMD64_) || defined(_X86_) || defined(_ARM_))
0027 #if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) ||           \
0028     defined(_M_AMD64)
0029 #define _AMD64_
0030 #elif defined(i386) || defined(__i386) || defined(__i386__) || defined(__i386__) || defined(_M_IX86)
0031 #define _X86_
0032 #elif defined(__arm__) || defined(_M_ARM) || defined(_M_ARMT)
0033 #define _ARM_
0034 #elif defined(__aarch64__) || defined(_M_ARM64)
0035 #define _ARM64_
0036 #elif defined(_M_ARM64EC)
0037 #define _ARM64EC_
0038 #endif
0039 #endif
0040 
0041 // first
0042 #ifndef NOMINMAX
0043 // if NOMINMAX is already defined we don't want to mess with that either way
0044 #define NOMINMAX
0045 #include <windef.h>
0046 #undef NOMINMAX
0047 #else
0048 #include <windef.h>
0049 #endif
0050 
0051 // second
0052 #include <winbase.h>
0053 // third
0054 #include <processthreadsapi.h>
0055 #include <shellapi.h>
0056 #endif
0057 // [CLI11:argv_inl_includes:end]
0058 
0059 namespace CLI {
0060 // [CLI11:argv_inl_hpp:verbatim]
0061 
0062 namespace detail {
0063 
0064 #ifdef _WIN32
0065 CLI11_INLINE std::vector<std::string> compute_win32_argv() {
0066     std::vector<std::string> result;
0067     int argc = 0;
0068 
0069     auto deleter = [](wchar_t **ptr) { LocalFree(ptr); };
0070     // NOLINTBEGIN(*-avoid-c-arrays)
0071     auto wargv = std::unique_ptr<wchar_t *[], decltype(deleter)>(CommandLineToArgvW(GetCommandLineW(), &argc), deleter);
0072     // NOLINTEND(*-avoid-c-arrays)
0073 
0074     if(wargv == nullptr) {
0075         throw std::runtime_error("CommandLineToArgvW failed with code " + std::to_string(GetLastError()));
0076     }
0077 
0078     result.reserve(static_cast<size_t>(argc));
0079     for(size_t i = 0; i < static_cast<size_t>(argc); ++i) {
0080         result.push_back(narrow(wargv[i]));
0081     }
0082 
0083     return result;
0084 }
0085 #endif
0086 
0087 }  // namespace detail
0088 
0089 // [CLI11:argv_inl_hpp:end]
0090 }  // namespace CLI