-novid -nojoy -nosteamcontroller -nohltv -particles 1 -precachefontchars -noquicktime
$STEAM_LIBRARY\steamapps\common\Team Fortress 2\tf\custom\module.cfg
:
#include <ostream> | |
#include <string> | |
#include <type_traits> | |
#include <utility> | |
template <typename CharT, typename Arg> | |
auto | |
Print(std::ostream &os, [[maybe_unused]] CharT delimiter, const Arg &arg) | |
-> std::ostream & { | |
static_assert( |
CC = clang | |
CFLAGS = -std=c11 -O0 -g3 -Wall -Wextra | |
ASAN_FLAGS = -fsanitize=address -fsanitize-address-use-after-scope -fsanitize-recover=address | |
CSRC = $(wildcard *.c) | |
COBJ = $(patsubst %.c, %.o, $(CSRC)) | |
.PHONY: all | |
all: main |
# Debian | |
sudo apt install clang libc++-dev libc++abi-dev libunwind-dev | |
# Red Hat | |
## yum | |
sudo yum install libcxx-devel libunwind-devel | |
## dnf | |
sudo dnf install libcxx-devel libunwind-devel |
#include <concepts> | |
#include <iostream> | |
#include <type_traits> | |
struct BothAssignable { | |
constexpr auto operator=(const BothAssignable&) noexcept -> BothAssignable& = default; | |
constexpr auto operator=(BothAssignable&&) noexcept -> BothAssignable& = default; | |
}; | |
struct CopyAssignable { |
#include <iterator> // bidirectional_iterator, iterator_traits | |
#include <utility> // move, swap | |
template <std::bidirectional_iterator BidirectionalIterator, typename Compare, | |
typename ValueType = | |
typename std::iterator_traits<BidirectionalIterator>::value_type> | |
constexpr auto bubble_sort1(BidirectionalIterator begin, | |
BidirectionalIterator end, Compare compare) | |
-> void { | |
if (begin == end) { |
#include <iostream> // cout | |
#include <ranges> // range, subrange, cbegin, cend | |
#include <vector> | |
namespace { | |
auto print_range(const std::ranges::range auto &range, bool newline = true) | |
-> void; | |
namespace detail { |
#include <concepts> // integral | |
#include <unordered_set> | |
#include <utility> // pair | |
template <std::integral First, std::integral Second> | |
struct std::hash<std::pair<First, Second>> { | |
using argument_type = std::pair<First, Second>; | |
using result_type = std::size_t; | |
auto |
#include <concepts> // integral | |
#include <cstddef> // size_t | |
#include <iostream> // cout | |
#include <ranges> // iota, reverse | |
namespace { | |
constexpr auto | |
is_bit_set(long long i, std::size_t n) -> bool { | |
return (i & (1LL << n)) != 0; |
/* | |
* As shown below, this code is not meant for getting the parity of a number; | |
* rather, it checks the parity flag. The reason is that the parity flag only | |
* represents whether the least significant byte has odd or even number of set | |
* bits. So, it should not be used to check the parity of a number in practice | |
* unless the number is one byte long. | |
* | |
* Having said that, an implementation-defined function by Clang and GCC for | |
* parity computation, __builtin_parity(x), returns 0 if x has even set bits and | |
* 1 if odd, which is the opposite of the parity flag. That is the reason why |