init
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Close stale issues and PRs / stale (push) Successful in 13s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Close stale issues and PRs / stale (push) Successful in 13s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
This commit is contained in:
10
Telegram/ThirdParty/expected/.appveyor.yml
vendored
Normal file
10
Telegram/ThirdParty/expected/.appveyor.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
os:
|
||||
- Visual Studio 2015
|
||||
- Visual Studio 2017
|
||||
- Visual Studio 2019
|
||||
- Visual Studio 2022
|
||||
|
||||
build_script:
|
||||
- cmake -Bbuild -S.
|
||||
- cmake --build build
|
||||
- cmake --build build --target RUN_TESTS
|
||||
1
Telegram/ThirdParty/expected/.clang-format
vendored
Normal file
1
Telegram/ThirdParty/expected/.clang-format
vendored
Normal file
@@ -0,0 +1 @@
|
||||
BasedOnStyle: LLVM
|
||||
131
Telegram/ThirdParty/expected/.github/workflows/cmake.yml
vendored
Normal file
131
Telegram/ThirdParty/expected/.github/workflows/cmake.yml
vendored
Normal file
@@ -0,0 +1,131 @@
|
||||
name: CMake
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "master" ]
|
||||
pull_request:
|
||||
branches: [ "master" ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
std: [11, 14]
|
||||
cxx: [g++-4.8, g++-4.9, g++-5, g++-6, g++-7, g++-8, g++-9, g++-10, clang++-3.5, clang++-3.6, clang++-3.7, clang++-3.8, clang++-3.9, clang++-4.0, clang++-5.0, clang++-6.0, clang++-7, clang++-8, clang++-9, clang++-10, clang++-11]
|
||||
|
||||
exclude:
|
||||
- cxx: g++-4.8
|
||||
std: 14
|
||||
- cxx: g++4.9
|
||||
std: 14
|
||||
|
||||
include:
|
||||
- cxx: g++-4.8
|
||||
install: sudo apt install g++-4.8
|
||||
- cxx: g++-4.9
|
||||
install: sudo apt install g++-4.9
|
||||
- cxx: g++-5
|
||||
install: sudo apt install g++-5
|
||||
- cxx: g++-6
|
||||
install: sudo apt install g++-6
|
||||
- cxx: g++-7
|
||||
install: sudo apt install g++-7
|
||||
- cxx: g++-8
|
||||
std: 11
|
||||
install: sudo apt install g++-8
|
||||
- cxx: g++-8
|
||||
std: 14
|
||||
install: sudo apt install g++-8
|
||||
- cxx: g++-8
|
||||
std: 17
|
||||
install: sudo apt install g++-8
|
||||
- cxx: g++-9
|
||||
std: 14
|
||||
- cxx: g++-9
|
||||
std: 17
|
||||
- cxx: g++-10
|
||||
std: 14
|
||||
- cxx: g++-10
|
||||
std: 17
|
||||
- cxx: g++-11
|
||||
std: 14
|
||||
install: sudo apt install g++-11
|
||||
- cxx: g++-11
|
||||
std: 17
|
||||
install: sudo apt install g++-11
|
||||
- cxx: g++-11
|
||||
std: 20
|
||||
install: sudo apt install g++-11
|
||||
|
||||
|
||||
- cxx: clang++-3.5
|
||||
install: sudo apt install clang-3.5
|
||||
- cxx: clang++-3.6
|
||||
install: sudo apt install clang-3.6
|
||||
- cxx: clang++-3.7
|
||||
install: sudo apt install clang-3.7
|
||||
- cxx: clang++-3.8
|
||||
install: sudo apt install clang-3.8
|
||||
- cxx: clang++-3.9
|
||||
install: sudo apt install clang-3.9
|
||||
- cxx: clang++-4.0
|
||||
install: sudo apt install clang-4.0
|
||||
- cxx: clang++-5.0
|
||||
install: sudo apt install clang-5.0
|
||||
- cxx: clang++-6.0
|
||||
install: sudo apt install clang-6.0
|
||||
- cxx: clang++-7
|
||||
install: sudo apt install clang-7
|
||||
- cxx: clang++-8
|
||||
install: sudo apt install clang-8
|
||||
- cxx: clang++-9
|
||||
install: sudo apt install clang-9
|
||||
- cxx: clang++-10
|
||||
install: sudo apt install clang-10
|
||||
- cxx: clang++-11
|
||||
install: sudo apt install clang-11
|
||||
|
||||
|
||||
- cxx: clang++-6.0
|
||||
std: 17
|
||||
install: sudo apt install clang-6.0
|
||||
- cxx: clang++-7
|
||||
std: 17
|
||||
install: sudo apt install clang-7
|
||||
- cxx: clang++-8
|
||||
std: 17
|
||||
install: sudo apt install clang-8
|
||||
- cxx: clang++-9
|
||||
std: 17
|
||||
install: sudo apt install clang-9
|
||||
- cxx: clang++-10
|
||||
std: 17
|
||||
install: sudo apt install clang-10
|
||||
- cxx: clang++-11
|
||||
std: 17
|
||||
install: sudo apt install clang-11
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Setup Toolchain
|
||||
run: |
|
||||
sudo apt-add-repository 'deb http://azure.archive.ubuntu.com/ubuntu/ xenial main'
|
||||
sudo apt-add-repository 'deb http://azure.archive.ubuntu.com/ubuntu/ xenial universe'
|
||||
sudo apt-add-repository 'deb http://azure.archive.ubuntu.com/ubuntu/ bionic main'
|
||||
sudo apt-add-repository 'deb http://azure.archive.ubuntu.com/ubuntu/ bionic universe'
|
||||
${{matrix.install}}
|
||||
|
||||
- name: Configure CMake
|
||||
env:
|
||||
CXX: ${{matrix.cxx}}
|
||||
run: cmake -B ${{github.workspace}}/build -DCMAKE_CXX_STANDARD=${{matrix.std}}
|
||||
|
||||
- name: Build
|
||||
run: cmake --build ${{github.workspace}}/build
|
||||
|
||||
- name: Test
|
||||
working-directory: ${{github.workspace}}/build
|
||||
run: cmake --build ${{github.workspace}}/build --target test
|
||||
3
Telegram/ThirdParty/expected/.gitignore
vendored
Normal file
3
Telegram/ThirdParty/expected/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
\#*
|
||||
.\#*
|
||||
/build/
|
||||
268
Telegram/ThirdParty/expected/.travis.yml
vendored
Normal file
268
Telegram/ThirdParty/expected/.travis.yml
vendored
Normal file
@@ -0,0 +1,268 @@
|
||||
language: cpp
|
||||
|
||||
dist: xenial
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-5
|
||||
env: COMPILER=g++-5 CXXSTD=11
|
||||
- compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-6
|
||||
env: COMPILER=g++-6 CXXSTD=11
|
||||
- compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-7
|
||||
env: COMPILER=g++-7 CXXSTD=11
|
||||
- compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-8
|
||||
env: COMPILER=g++-8 CXXSTD=11
|
||||
- compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-4.9
|
||||
env: COMPILER=g++-4.9 CXXSTD=11
|
||||
- compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-4.8
|
||||
env: COMPILER=g++-4.8 CXXSTD=11
|
||||
- compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-precise-3.5
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang++-3.5
|
||||
- libc++-dev
|
||||
env: COMPILER=clang++-3.5 CXXSTD=11
|
||||
- compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-precise-3.6
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang++-3.6
|
||||
- libc++-dev
|
||||
env: COMPILER=clang++-3.6 CXXSTD=11
|
||||
- compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-precise-3.7
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang++-3.7
|
||||
- libc++-dev
|
||||
env: COMPILER=clang++-3.7 CXXSTD=11
|
||||
- compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-3.8 main"
|
||||
key_url: "http://apt.llvm.org/llvm-snapshot.gpg.key"
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang++-3.8
|
||||
- libc++-dev
|
||||
env: COMPILER=clang++-3.8 CXXSTD=11
|
||||
- compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-3.9 main"
|
||||
key_url: "http://apt.llvm.org/llvm-snapshot.gpg.key"
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang++-3.9
|
||||
- libc++-dev
|
||||
env: COMPILER=clang++-3.9 CXXSTD=11
|
||||
- compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-xenial-4.0
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang++-4.0
|
||||
- libc++-dev
|
||||
env: COMPILER=clang++-4.0 CXXSTD=11
|
||||
- compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-xenial-5.0
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang++-5.0
|
||||
- libc++-dev
|
||||
env: COMPILER=clang++-5.0 CXXSTD=11
|
||||
- compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-xenial-6.0
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang++-6.0
|
||||
- libc++-dev
|
||||
env: COMPILER=clang++-6.0 CXXSTD=11
|
||||
|
||||
- compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-5
|
||||
env: COMPILER=g++-5 CXXSTD=14
|
||||
- compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-6
|
||||
env: COMPILER=g++-6 CXXSTD=14
|
||||
- compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-7
|
||||
env: COMPILER=g++-7 CXXSTD=14
|
||||
- compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-8
|
||||
env: COMPILER=g++-8 CXXSTD=14
|
||||
- compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-precise-3.5
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang++-3.5
|
||||
- libc++-dev
|
||||
env: COMPILER=clang++-3.5 CXXSTD=14
|
||||
- compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-precise-3.6
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang++-3.6
|
||||
- libc++-dev
|
||||
env: COMPILER=clang++-3.6 CXXSTD=14
|
||||
- compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-precise-3.7
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang++-3.7
|
||||
- libc++-dev
|
||||
env: COMPILER=clang++-3.7 CXXSTD=14
|
||||
- compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-3.8 main"
|
||||
key_url: "http://apt.llvm.org/llvm-snapshot.gpg.key"
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang++-3.8
|
||||
- libc++-dev
|
||||
env: COMPILER=clang++-3.8 CXXSTD=14
|
||||
- compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-3.9 main"
|
||||
key_url: "http://apt.llvm.org/llvm-snapshot.gpg.key"
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang++-3.9
|
||||
- libc++-dev
|
||||
env: COMPILER=clang++-3.9 CXXSTD=14
|
||||
- compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-xenial-4.0
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang++-4.0
|
||||
- libc++-dev
|
||||
env: COMPILER=clang++-4.0 CXXSTD=14
|
||||
- compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-xenial-5.0
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang++-5.0
|
||||
- libc++-dev
|
||||
env: COMPILER=clang++-5.0 CXXSTD=14
|
||||
- compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-xenial-6.0
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang++-6.0
|
||||
- libc++-dev
|
||||
env: COMPILER=clang++-6.0 CXXSTD=14
|
||||
|
||||
before_install:
|
||||
- sudo apt update
|
||||
- sudo apt install -y apt-transport-https ca-certificates gnupg software-properties-common
|
||||
- curl -L https://apt.kitware.com/keys/kitware-archive-latest.asc | sudo apt-key add -
|
||||
- sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ xenial main'
|
||||
- sudo apt update
|
||||
|
||||
install:
|
||||
- if [ "$CXX" = "clang++" ]; then export CXX="$COMPILER -stdlib=libc++"; fi
|
||||
- if [ "$CXX" = "g++" ]; then export CXX="$COMPILER"; fi
|
||||
- sudo apt install -y cmake
|
||||
|
||||
script:
|
||||
- /usr/bin/cmake -B build -S . "-DCMAKE_CXX_STANDARD=$CXXSTD"
|
||||
- /usr/bin/cmake --build build
|
||||
- /usr/bin/cmake --build build --target test
|
||||
117
Telegram/ThirdParty/expected/CMakeLists.txt
vendored
Normal file
117
Telegram/ThirdParty/expected/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,117 @@
|
||||
cmake_minimum_required(VERSION 3.14)
|
||||
project(tl-expected
|
||||
HOMEPAGE_URL https://tl.tartanllama.xyz
|
||||
DESCRIPTION "C++11/14/17 std::expected with functional-style extensions"
|
||||
VERSION 1.0.0
|
||||
LANGUAGES CXX)
|
||||
|
||||
include(CMakePackageConfigHelpers)
|
||||
include(CMakeDependentOption)
|
||||
include(GNUInstallDirs)
|
||||
include(FetchContent)
|
||||
include(CTest)
|
||||
|
||||
if (NOT DEFINED CMAKE_CXX_STANDARD)
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
endif()
|
||||
|
||||
option(EXPECTED_BUILD_PACKAGE "Build package files as well" ON)
|
||||
|
||||
cmake_dependent_option(EXPECTED_BUILD_TESTS
|
||||
"Enable tl::expected tests" ON
|
||||
"BUILD_TESTING" OFF)
|
||||
|
||||
cmake_dependent_option(EXPECTED_BUILD_PACKAGE_DEB
|
||||
"Create a DEB" ON
|
||||
"EXPECTED_BUILD_PACKAGE" OFF)
|
||||
|
||||
add_library(expected INTERFACE)
|
||||
target_include_directories(expected
|
||||
INTERFACE
|
||||
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:include>)
|
||||
|
||||
if (NOT CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
|
||||
add_library(tl::expected ALIAS expected)
|
||||
endif()
|
||||
|
||||
# Installation help
|
||||
configure_package_config_file(
|
||||
"${PROJECT_SOURCE_DIR}/cmake/${PROJECT_NAME}-config.cmake.in"
|
||||
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
|
||||
INSTALL_DESTINATION "share/cmake/${PROJECT_NAME}")
|
||||
|
||||
write_basic_package_version_file(
|
||||
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
|
||||
COMPATIBILITY SameMajorVersion
|
||||
ARCH_INDEPENDENT)
|
||||
|
||||
install(TARGETS expected
|
||||
EXPORT ${PROJECT_NAME}-targets
|
||||
INCLUDES DESTINATION "${CMAKE_INSTALL_DATADIR}")
|
||||
|
||||
install(EXPORT ${PROJECT_NAME}-targets
|
||||
DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/${PROJECT_NAME}"
|
||||
NAMESPACE tl::
|
||||
FILE "${PROJECT_NAME}-targets.cmake")
|
||||
|
||||
install(FILES
|
||||
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
|
||||
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
|
||||
DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/${PROJECT_NAME}")
|
||||
|
||||
install(DIRECTORY "include/" TYPE INCLUDE)
|
||||
|
||||
if(EXPECTED_BUILD_TESTS)
|
||||
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
|
||||
set(CATCH_INSTALL_HELPERS OFF)
|
||||
set(CATCH_BUILD_TESTING OFF)
|
||||
set(CATCH_INSTALL_DOCS OFF)
|
||||
FetchContent_Declare(Catch2 URL
|
||||
https://github.com/catchorg/Catch2/archive/v2.13.10.zip)
|
||||
FetchContent_MakeAvailable(Catch2)
|
||||
|
||||
file(GLOB test-sources CONFIGURE_DEPENDS tests/*.cpp)
|
||||
list(FILTER test-sources EXCLUDE REGEX "tests/test.cpp")
|
||||
add_executable(${PROJECT_NAME}-tests "${test-sources}")
|
||||
target_compile_options(${PROJECT_NAME}-tests PRIVATE
|
||||
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wall -Wextra>)
|
||||
|
||||
target_link_libraries(${PROJECT_NAME}-tests
|
||||
PRIVATE
|
||||
Catch2::Catch2
|
||||
expected)
|
||||
add_test(NAME tl::expected::tests COMMAND ${PROJECT_NAME}-tests)
|
||||
endif()
|
||||
|
||||
if (NOT EXPECTED_BUILD_PACKAGE)
|
||||
return()
|
||||
endif()
|
||||
|
||||
list(APPEND source-generators TBZ2 TGZ TXZ ZIP)
|
||||
|
||||
if (CMAKE_HOST_WIN32)
|
||||
list(APPEND binary-generators "WIX")
|
||||
endif()
|
||||
|
||||
if (EXPECTED_BUILD_PACKAGE_DEB)
|
||||
list(APPEND binary-generators "DEB")
|
||||
endif()
|
||||
|
||||
if (EXPECTED_BUILD_RPM)
|
||||
list(APPEND binary-generators "RPM")
|
||||
endif()
|
||||
|
||||
|
||||
set(CPACK_SOURCE_GENERATOR ${source-generators})
|
||||
set(CPACK_GENERATOR ${binary-generators})
|
||||
|
||||
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}")
|
||||
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}")
|
||||
|
||||
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Sy Brand")
|
||||
|
||||
list(APPEND CPACK_SOURCE_IGNORE_FILES /.git/ /build/ .gitignore .DS_Store)
|
||||
|
||||
include(CPack)
|
||||
|
||||
121
Telegram/ThirdParty/expected/COPYING
vendored
Normal file
121
Telegram/ThirdParty/expected/COPYING
vendored
Normal file
@@ -0,0 +1,121 @@
|
||||
Creative Commons Legal Code
|
||||
|
||||
CC0 1.0 Universal
|
||||
|
||||
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
|
||||
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
|
||||
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
|
||||
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
|
||||
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
|
||||
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
|
||||
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
|
||||
HEREUNDER.
|
||||
|
||||
Statement of Purpose
|
||||
|
||||
The laws of most jurisdictions throughout the world automatically confer
|
||||
exclusive Copyright and Related Rights (defined below) upon the creator
|
||||
and subsequent owner(s) (each and all, an "owner") of an original work of
|
||||
authorship and/or a database (each, a "Work").
|
||||
|
||||
Certain owners wish to permanently relinquish those rights to a Work for
|
||||
the purpose of contributing to a commons of creative, cultural and
|
||||
scientific works ("Commons") that the public can reliably and without fear
|
||||
of later claims of infringement build upon, modify, incorporate in other
|
||||
works, reuse and redistribute as freely as possible in any form whatsoever
|
||||
and for any purposes, including without limitation commercial purposes.
|
||||
These owners may contribute to the Commons to promote the ideal of a free
|
||||
culture and the further production of creative, cultural and scientific
|
||||
works, or to gain reputation or greater distribution for their Work in
|
||||
part through the use and efforts of others.
|
||||
|
||||
For these and/or other purposes and motivations, and without any
|
||||
expectation of additional consideration or compensation, the person
|
||||
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
|
||||
is an owner of Copyright and Related Rights in the Work, voluntarily
|
||||
elects to apply CC0 to the Work and publicly distribute the Work under its
|
||||
terms, with knowledge of his or her Copyright and Related Rights in the
|
||||
Work and the meaning and intended legal effect of CC0 on those rights.
|
||||
|
||||
1. Copyright and Related Rights. A Work made available under CC0 may be
|
||||
protected by copyright and related or neighboring rights ("Copyright and
|
||||
Related Rights"). Copyright and Related Rights include, but are not
|
||||
limited to, the following:
|
||||
|
||||
i. the right to reproduce, adapt, distribute, perform, display,
|
||||
communicate, and translate a Work;
|
||||
ii. moral rights retained by the original author(s) and/or performer(s);
|
||||
iii. publicity and privacy rights pertaining to a person's image or
|
||||
likeness depicted in a Work;
|
||||
iv. rights protecting against unfair competition in regards to a Work,
|
||||
subject to the limitations in paragraph 4(a), below;
|
||||
v. rights protecting the extraction, dissemination, use and reuse of data
|
||||
in a Work;
|
||||
vi. database rights (such as those arising under Directive 96/9/EC of the
|
||||
European Parliament and of the Council of 11 March 1996 on the legal
|
||||
protection of databases, and under any national implementation
|
||||
thereof, including any amended or successor version of such
|
||||
directive); and
|
||||
vii. other similar, equivalent or corresponding rights throughout the
|
||||
world based on applicable law or treaty, and any national
|
||||
implementations thereof.
|
||||
|
||||
2. Waiver. To the greatest extent permitted by, but not in contravention
|
||||
of, applicable law, Affirmer hereby overtly, fully, permanently,
|
||||
irrevocably and unconditionally waives, abandons, and surrenders all of
|
||||
Affirmer's Copyright and Related Rights and associated claims and causes
|
||||
of action, whether now known or unknown (including existing as well as
|
||||
future claims and causes of action), in the Work (i) in all territories
|
||||
worldwide, (ii) for the maximum duration provided by applicable law or
|
||||
treaty (including future time extensions), (iii) in any current or future
|
||||
medium and for any number of copies, and (iv) for any purpose whatsoever,
|
||||
including without limitation commercial, advertising or promotional
|
||||
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
|
||||
member of the public at large and to the detriment of Affirmer's heirs and
|
||||
successors, fully intending that such Waiver shall not be subject to
|
||||
revocation, rescission, cancellation, termination, or any other legal or
|
||||
equitable action to disrupt the quiet enjoyment of the Work by the public
|
||||
as contemplated by Affirmer's express Statement of Purpose.
|
||||
|
||||
3. Public License Fallback. Should any part of the Waiver for any reason
|
||||
be judged legally invalid or ineffective under applicable law, then the
|
||||
Waiver shall be preserved to the maximum extent permitted taking into
|
||||
account Affirmer's express Statement of Purpose. In addition, to the
|
||||
extent the Waiver is so judged Affirmer hereby grants to each affected
|
||||
person a royalty-free, non transferable, non sublicensable, non exclusive,
|
||||
irrevocable and unconditional license to exercise Affirmer's Copyright and
|
||||
Related Rights in the Work (i) in all territories worldwide, (ii) for the
|
||||
maximum duration provided by applicable law or treaty (including future
|
||||
time extensions), (iii) in any current or future medium and for any number
|
||||
of copies, and (iv) for any purpose whatsoever, including without
|
||||
limitation commercial, advertising or promotional purposes (the
|
||||
"License"). The License shall be deemed effective as of the date CC0 was
|
||||
applied by Affirmer to the Work. Should any part of the License for any
|
||||
reason be judged legally invalid or ineffective under applicable law, such
|
||||
partial invalidity or ineffectiveness shall not invalidate the remainder
|
||||
of the License, and in such case Affirmer hereby affirms that he or she
|
||||
will not (i) exercise any of his or her remaining Copyright and Related
|
||||
Rights in the Work or (ii) assert any associated claims and causes of
|
||||
action with respect to the Work, in either case contrary to Affirmer's
|
||||
express Statement of Purpose.
|
||||
|
||||
4. Limitations and Disclaimers.
|
||||
|
||||
a. No trademark or patent rights held by Affirmer are waived, abandoned,
|
||||
surrendered, licensed or otherwise affected by this document.
|
||||
b. Affirmer offers the Work as-is and makes no representations or
|
||||
warranties of any kind concerning the Work, express, implied,
|
||||
statutory or otherwise, including without limitation warranties of
|
||||
title, merchantability, fitness for a particular purpose, non
|
||||
infringement, or the absence of latent or other defects, accuracy, or
|
||||
the present or absence of errors, whether or not discoverable, all to
|
||||
the greatest extent permissible under applicable law.
|
||||
c. Affirmer disclaims responsibility for clearing rights of other persons
|
||||
that may apply to the Work or any use thereof, including without
|
||||
limitation any person's Copyright and Related Rights in the Work.
|
||||
Further, Affirmer disclaims responsibility for obtaining any necessary
|
||||
consents, permissions or other rights required for any use of the
|
||||
Work.
|
||||
d. Affirmer understands and acknowledges that Creative Commons is not a
|
||||
party to this document and has no duty or obligation with respect to
|
||||
this CC0 or use of the Work.
|
||||
76
Telegram/ThirdParty/expected/README.md
vendored
Normal file
76
Telegram/ThirdParty/expected/README.md
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
# expected
|
||||
Single header implementation of `std::expected` with functional-style extensions.
|
||||
|
||||
[](https://tl.tartanllama.xyz/en/latest/?badge=latest)
|
||||
Clang + GCC: [](https://github.com/TartanLlama/expected/actions/workflows/cmake.yml)
|
||||
MSVC: [](https://ci.appveyor.com/project/TartanLlama/expected)
|
||||
|
||||
Available on [Vcpkg](https://github.com/microsoft/vcpkg/tree/master/ports/tl-expected) and [Conan](https://github.com/yipdw/conan-tl-expected).
|
||||
|
||||
[`std::expected`](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0323r3.pdf) is proposed as the preferred way to represent object which will either have an expected value, or an unexpected value giving information about why something failed. Unfortunately, chaining together many computations which may fail can be verbose, as error-checking code will be mixed in with the actual programming logic. This implementation provides a number of utilities to make coding with `expected` cleaner.
|
||||
|
||||
For example, instead of writing this code:
|
||||
|
||||
```cpp
|
||||
std::expected<image,fail_reason> get_cute_cat (const image& img) {
|
||||
auto cropped = crop_to_cat(img);
|
||||
if (!cropped) {
|
||||
return cropped;
|
||||
}
|
||||
|
||||
auto with_tie = add_bow_tie(*cropped);
|
||||
if (!with_tie) {
|
||||
return with_tie;
|
||||
}
|
||||
|
||||
auto with_sparkles = make_eyes_sparkle(*with_tie);
|
||||
if (!with_sparkles) {
|
||||
return with_sparkles;
|
||||
}
|
||||
|
||||
return add_rainbow(make_smaller(*with_sparkles));
|
||||
}
|
||||
```
|
||||
|
||||
You can do this:
|
||||
|
||||
```cpp
|
||||
tl::expected<image,fail_reason> get_cute_cat (const image& img) {
|
||||
return crop_to_cat(img)
|
||||
.and_then(add_bow_tie)
|
||||
.and_then(make_eyes_sparkle)
|
||||
.map(make_smaller)
|
||||
.map(add_rainbow);
|
||||
}
|
||||
```
|
||||
|
||||
The interface is the same as `std::expected` as proposed in [p0323r3](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0323r3.pdf), but the following member functions are also defined. Explicit types are for clarity.
|
||||
|
||||
- `map`: carries out some operation on the stored object if there is one.
|
||||
* `tl::expected<std::size_t,std::error_code> s = exp_string.map(&std::string::size);`
|
||||
- `map_error`: carries out some operation on the unexpected object if there is one.
|
||||
* `my_error_code translate_error (std::error_code);`
|
||||
* `tl::expected<int,my_error_code> s = exp_int.map_error(translate_error);`
|
||||
- `and_then`: like `map`, but for operations which return a `tl::expected`.
|
||||
* `tl::expected<ast, fail_reason> parse (const std::string& s);`
|
||||
* `tl::expected<ast, fail_reason> exp_ast = exp_string.and_then(parse);`
|
||||
- `or_else`: calls some function if there is no value stored.
|
||||
* `exp.or_else([] { throw std::runtime_error{"oh no"}; });`
|
||||
|
||||
p0323r3 specifies calling `.error()` on an expected value, or using the `*` or `->` operators on an unexpected value, to be undefined behaviour. In this implementation it causes an assertion failure. The implementation of assertions can be overridden by defining the macro `TL_ASSERT(boolean_condition)` before #including <tl/expected.hpp>; by default, `assert(boolean_condition)` from the `<cassert>` header is used. Note that correct code would not rely on these assertions.
|
||||
|
||||
### Compiler support
|
||||
|
||||
Tested on:
|
||||
|
||||
- Linux
|
||||
* clang++ 3.5, 3.6, 3.7, 3.8, 3.9, 4, 5, 6, 7, 8, 9, 10, 11
|
||||
* g++ 4.8, 4.9, 5.5, 6.4, 7.5, 8, 9, 10
|
||||
- Windows
|
||||
* MSVC 2015, 2017, 2019, 2022
|
||||
|
||||
----------
|
||||
|
||||
[]("http://creativecommons.org/publicdomain/zero/1.0/")
|
||||
|
||||
To the extent possible under law, [Sy Brand](https://twitter.com/TartanLlama) has waived all copyright and related or neighboring rights to the `expected` library. This work is published from: United Kingdom.
|
||||
3
Telegram/ThirdParty/expected/cmake/tl-expected-config.cmake.in
vendored
Normal file
3
Telegram/ThirdParty/expected/cmake/tl-expected-config.cmake.in
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
@PACKAGE_INIT@
|
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/tl-expected-targets.cmake")
|
||||
2444
Telegram/ThirdParty/expected/include/tl/expected.hpp
vendored
Normal file
2444
Telegram/ThirdParty/expected/include/tl/expected.hpp
vendored
Normal file
File diff suppressed because it is too large
Load Diff
18
Telegram/ThirdParty/expected/tests/assertions.cpp
vendored
Normal file
18
Telegram/ThirdParty/expected/tests/assertions.cpp
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
#include <catch2/catch.hpp>
|
||||
#include <stdexcept>
|
||||
|
||||
#define TL_ASSERT(cond) if (!(cond)) { throw std::runtime_error(std::string("assertion failure")); }
|
||||
|
||||
#include <tl/expected.hpp>
|
||||
|
||||
TEST_CASE("Assertions", "[assertions]") {
|
||||
tl::expected<int,int> o1 = 42;
|
||||
REQUIRE_THROWS_WITH(o1.error(), "assertion failure");
|
||||
|
||||
tl::expected<int,int> o2 {tl::unexpect, 0};
|
||||
REQUIRE_THROWS_WITH(*o2, "assertion failure");
|
||||
|
||||
struct foo { int bar; };
|
||||
tl::expected<struct foo,int> o3 {tl::unexpect, 0};
|
||||
REQUIRE_THROWS_WITH(o3->bar, "assertion failure");
|
||||
}
|
||||
75
Telegram/ThirdParty/expected/tests/assignment.cpp
vendored
Normal file
75
Telegram/ThirdParty/expected/tests/assignment.cpp
vendored
Normal file
@@ -0,0 +1,75 @@
|
||||
#include <catch2/catch.hpp>
|
||||
#include <tl/expected.hpp>
|
||||
|
||||
TEST_CASE("Simple assignment", "[assignment.simple]") {
|
||||
tl::expected<int, int> e1 = 42;
|
||||
tl::expected<int, int> e2 = 17;
|
||||
tl::expected<int, int> e3 = 21;
|
||||
tl::expected<int, int> e4 = tl::make_unexpected(42);
|
||||
tl::expected<int, int> e5 = tl::make_unexpected(17);
|
||||
tl::expected<int, int> e6 = tl::make_unexpected(21);
|
||||
|
||||
e1 = e2;
|
||||
REQUIRE(e1);
|
||||
REQUIRE(*e1 == 17);
|
||||
REQUIRE(e2);
|
||||
REQUIRE(*e2 == 17);
|
||||
|
||||
e1 = std::move(e2);
|
||||
REQUIRE(e1);
|
||||
REQUIRE(*e1 == 17);
|
||||
REQUIRE(e2);
|
||||
REQUIRE(*e2 == 17);
|
||||
|
||||
e1 = 42;
|
||||
REQUIRE(e1);
|
||||
REQUIRE(*e1 == 42);
|
||||
|
||||
auto unex = tl::make_unexpected(12);
|
||||
e1 = unex;
|
||||
REQUIRE(!e1);
|
||||
REQUIRE(e1.error() == 12);
|
||||
|
||||
e1 = tl::make_unexpected(42);
|
||||
REQUIRE(!e1);
|
||||
REQUIRE(e1.error() == 42);
|
||||
|
||||
e1 = e3;
|
||||
REQUIRE(e1);
|
||||
REQUIRE(*e1 == 21);
|
||||
|
||||
e4 = e5;
|
||||
REQUIRE(!e4);
|
||||
REQUIRE(e4.error() == 17);
|
||||
|
||||
e4 = std::move(e6);
|
||||
REQUIRE(!e4);
|
||||
REQUIRE(e4.error() == 21);
|
||||
|
||||
e4 = e1;
|
||||
REQUIRE(e4);
|
||||
REQUIRE(*e4 == 21);
|
||||
}
|
||||
|
||||
TEST_CASE("Assignment deletion", "[assignment.deletion]") {
|
||||
struct has_all {
|
||||
has_all() = default;
|
||||
has_all(const has_all &) = default;
|
||||
has_all(has_all &&) noexcept = default;
|
||||
has_all &operator=(const has_all &) = default;
|
||||
};
|
||||
|
||||
tl::expected<has_all, has_all> e1 = {};
|
||||
tl::expected<has_all, has_all> e2 = {};
|
||||
e1 = e2;
|
||||
|
||||
struct except_move {
|
||||
except_move() = default;
|
||||
except_move(const except_move &) = default;
|
||||
except_move(except_move &&) noexcept(false){};
|
||||
except_move &operator=(const except_move &) = default;
|
||||
};
|
||||
tl::expected<except_move, except_move> e3 = {};
|
||||
tl::expected<except_move, except_move> e4 = {};
|
||||
// e3 = e4; should not compile
|
||||
}
|
||||
191
Telegram/ThirdParty/expected/tests/bases.cpp
vendored
Normal file
191
Telegram/ThirdParty/expected/tests/bases.cpp
vendored
Normal file
@@ -0,0 +1,191 @@
|
||||
#include <catch2/catch.hpp>
|
||||
#include <tl/expected.hpp>
|
||||
|
||||
#include <string>
|
||||
|
||||
// Old versions of GCC don't have the correct trait names. Could fix them up if needs be.
|
||||
#if (defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ <= 9 && \
|
||||
!defined(__clang__))
|
||||
// nothing for now
|
||||
#else
|
||||
TEST_CASE("Triviality", "[bases.triviality]") {
|
||||
REQUIRE(std::is_trivially_copy_constructible<tl::expected<int,int>>::value);
|
||||
REQUIRE(std::is_trivially_copy_assignable<tl::expected<int,int>>::value);
|
||||
REQUIRE(std::is_trivially_move_constructible<tl::expected<int,int>>::value);
|
||||
REQUIRE(std::is_trivially_move_assignable<tl::expected<int,int>>::value);
|
||||
REQUIRE(std::is_trivially_destructible<tl::expected<int,int>>::value);
|
||||
|
||||
REQUIRE(std::is_trivially_copy_constructible<tl::expected<void,int>>::value);
|
||||
REQUIRE(std::is_trivially_move_constructible<tl::expected<void,int>>::value);
|
||||
REQUIRE(std::is_trivially_destructible<tl::expected<void,int>>::value);
|
||||
|
||||
|
||||
{
|
||||
struct T {
|
||||
T(const T&) = default;
|
||||
T(T&&) = default;
|
||||
T& operator=(const T&) = default;
|
||||
T& operator=(T&&) = default;
|
||||
~T() = default;
|
||||
};
|
||||
REQUIRE(std::is_trivially_copy_constructible<tl::expected<T,int>>::value);
|
||||
REQUIRE(std::is_trivially_copy_assignable<tl::expected<T,int>>::value);
|
||||
REQUIRE(std::is_trivially_move_constructible<tl::expected<T,int>>::value);
|
||||
REQUIRE(std::is_trivially_move_assignable<tl::expected<T,int>>::value);
|
||||
REQUIRE(std::is_trivially_destructible<tl::expected<T,int>>::value);
|
||||
}
|
||||
|
||||
{
|
||||
struct T {
|
||||
T(const T&){}
|
||||
T(T&&) {}
|
||||
T& operator=(const T&) { return *this; }
|
||||
T& operator=(T&&) { return *this; }
|
||||
~T(){}
|
||||
};
|
||||
REQUIRE(!std::is_trivially_copy_constructible<tl::expected<T,int>>::value);
|
||||
REQUIRE(!std::is_trivially_copy_assignable<tl::expected<T,int>>::value);
|
||||
REQUIRE(!std::is_trivially_move_constructible<tl::expected<T,int>>::value);
|
||||
REQUIRE(!std::is_trivially_move_assignable<tl::expected<T,int>>::value);
|
||||
REQUIRE(!std::is_trivially_destructible<tl::expected<T,int>>::value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
TEST_CASE("Deletion", "[bases.deletion]") {
|
||||
REQUIRE(std::is_copy_constructible<tl::expected<int,int>>::value);
|
||||
REQUIRE(std::is_copy_assignable<tl::expected<int,int>>::value);
|
||||
REQUIRE(std::is_move_constructible<tl::expected<int,int>>::value);
|
||||
REQUIRE(std::is_move_assignable<tl::expected<int,int>>::value);
|
||||
REQUIRE(std::is_destructible<tl::expected<int,int>>::value);
|
||||
|
||||
{
|
||||
struct T {
|
||||
T()=default;
|
||||
};
|
||||
REQUIRE(std::is_default_constructible<tl::expected<T,int>>::value);
|
||||
}
|
||||
|
||||
{
|
||||
struct T {
|
||||
T(int){}
|
||||
};
|
||||
REQUIRE(!std::is_default_constructible<tl::expected<T,int>>::value);
|
||||
}
|
||||
|
||||
{
|
||||
struct T {
|
||||
T(const T&) = default;
|
||||
T(T&&) = default;
|
||||
T& operator=(const T&) = default;
|
||||
T& operator=(T&&) = default;
|
||||
~T() = default;
|
||||
};
|
||||
REQUIRE(std::is_copy_constructible<tl::expected<T,int>>::value);
|
||||
REQUIRE(std::is_copy_assignable<tl::expected<T,int>>::value);
|
||||
REQUIRE(std::is_move_constructible<tl::expected<T,int>>::value);
|
||||
REQUIRE(std::is_move_assignable<tl::expected<T,int>>::value);
|
||||
REQUIRE(std::is_destructible<tl::expected<T,int>>::value);
|
||||
}
|
||||
|
||||
{
|
||||
struct T {
|
||||
T(const T&)=delete;
|
||||
T(T&&)=delete;
|
||||
T& operator=(const T&)=delete;
|
||||
T& operator=(T&&)=delete;
|
||||
};
|
||||
REQUIRE(!std::is_copy_constructible<tl::expected<T,int>>::value);
|
||||
REQUIRE(!std::is_copy_assignable<tl::expected<T,int>>::value);
|
||||
REQUIRE(!std::is_move_constructible<tl::expected<T,int>>::value);
|
||||
REQUIRE(!std::is_move_assignable<tl::expected<T,int>>::value);
|
||||
}
|
||||
|
||||
{
|
||||
struct T {
|
||||
T(const T&)=delete;
|
||||
T(T&&)=default;
|
||||
T& operator=(const T&)=delete;
|
||||
T& operator=(T&&)=default;
|
||||
};
|
||||
REQUIRE(!std::is_copy_constructible<tl::expected<T,int>>::value);
|
||||
REQUIRE(!std::is_copy_assignable<tl::expected<T,int>>::value);
|
||||
REQUIRE(std::is_move_constructible<tl::expected<T,int>>::value);
|
||||
REQUIRE(std::is_move_assignable<tl::expected<T,int>>::value);
|
||||
}
|
||||
|
||||
{
|
||||
struct T {
|
||||
T(const T&)=default;
|
||||
T(T&&)=delete;
|
||||
T& operator=(const T&)=default;
|
||||
T& operator=(T&&)=delete;
|
||||
};
|
||||
REQUIRE(std::is_copy_constructible<tl::expected<T,int>>::value);
|
||||
REQUIRE(std::is_copy_assignable<tl::expected<T,int>>::value);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e;
|
||||
REQUIRE(std::is_default_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_copy_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_move_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_copy_assignable<decltype(e)>::value);
|
||||
REQUIRE(std::is_move_assignable<decltype(e)>::value);
|
||||
REQUIRE(TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(decltype(e))::value);
|
||||
REQUIRE(TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(decltype(e))::value);
|
||||
# if !defined(TL_EXPECTED_GCC49)
|
||||
REQUIRE(std::is_trivially_move_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_trivially_move_assignable<decltype(e)>::value);
|
||||
# endif
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, std::string> e;
|
||||
REQUIRE(std::is_default_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_copy_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_move_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_copy_assignable<decltype(e)>::value);
|
||||
REQUIRE(std::is_move_assignable<decltype(e)>::value);
|
||||
REQUIRE(!TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(decltype(e))::value);
|
||||
REQUIRE(!TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(decltype(e))::value);
|
||||
# if !defined(TL_EXPECTED_GCC49)
|
||||
REQUIRE(!std::is_trivially_move_constructible<decltype(e)>::value);
|
||||
REQUIRE(!std::is_trivially_move_assignable<decltype(e)>::value);
|
||||
# endif
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<std::string, int> e;
|
||||
REQUIRE(std::is_default_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_copy_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_move_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_copy_assignable<decltype(e)>::value);
|
||||
REQUIRE(std::is_move_assignable<decltype(e)>::value);
|
||||
REQUIRE(!TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(decltype(e))::value);
|
||||
REQUIRE(!TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(decltype(e))::value);
|
||||
# if !defined(TL_EXPECTED_GCC49)
|
||||
REQUIRE(!std::is_trivially_move_constructible<decltype(e)>::value);
|
||||
REQUIRE(!std::is_trivially_move_assignable<decltype(e)>::value);
|
||||
# endif
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<std::string, std::string> e;
|
||||
REQUIRE(std::is_default_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_copy_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_move_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_copy_assignable<decltype(e)>::value);
|
||||
REQUIRE(std::is_move_assignable<decltype(e)>::value);
|
||||
REQUIRE(!TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(decltype(e))::value);
|
||||
REQUIRE(!TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(decltype(e))::value);
|
||||
# if !defined(TL_EXPECTED_GCC49)
|
||||
REQUIRE(!std::is_trivially_move_constructible<decltype(e)>::value);
|
||||
REQUIRE(!std::is_trivially_move_assignable<decltype(e)>::value);
|
||||
# endif
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
6
Telegram/ThirdParty/expected/tests/constexpr.cpp
vendored
Normal file
6
Telegram/ThirdParty/expected/tests/constexpr.cpp
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
#include <catch2/catch.hpp>
|
||||
#include <tl/expected.hpp>
|
||||
|
||||
TEST_CASE("Constexpr", "[constexpr]") {
|
||||
//TODO
|
||||
}
|
||||
134
Telegram/ThirdParty/expected/tests/constructors.cpp
vendored
Normal file
134
Telegram/ThirdParty/expected/tests/constructors.cpp
vendored
Normal file
@@ -0,0 +1,134 @@
|
||||
#include <catch2/catch.hpp>
|
||||
#include <tl/expected.hpp>
|
||||
|
||||
#include <type_traits>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
struct takes_init_and_variadic {
|
||||
std::vector<int> v;
|
||||
std::tuple<int, int> t;
|
||||
template <class... Args>
|
||||
takes_init_and_variadic(std::initializer_list<int> l, Args &&... args)
|
||||
: v(l), t(std::forward<Args>(args)...) {}
|
||||
};
|
||||
|
||||
TEST_CASE("Constructors", "[constructors]") {
|
||||
{
|
||||
tl::expected<int,int> e;
|
||||
REQUIRE(e);
|
||||
REQUIRE(e == 0);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int,int> e = tl::make_unexpected(0);
|
||||
REQUIRE(!e);
|
||||
REQUIRE(e.error() == 0);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int,int> e (tl::unexpect, 0);
|
||||
REQUIRE(!e);
|
||||
REQUIRE(e.error() == 0);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int,int> e (tl::in_place, 42);
|
||||
REQUIRE(e);
|
||||
REQUIRE(e == 42);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<std::vector<int>,int> e (tl::in_place, {0,1});
|
||||
REQUIRE(e);
|
||||
REQUIRE((*e)[0] == 0);
|
||||
REQUIRE((*e)[1] == 1);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<std::tuple<int,int>,int> e (tl::in_place, 0, 1);
|
||||
REQUIRE(e);
|
||||
REQUIRE(std::get<0>(*e) == 0);
|
||||
REQUIRE(std::get<1>(*e) == 1);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<takes_init_and_variadic,int> e (tl::in_place, {0,1}, 2, 3);
|
||||
REQUIRE(e);
|
||||
REQUIRE(e->v[0] == 0);
|
||||
REQUIRE(e->v[1] == 1);
|
||||
REQUIRE(std::get<0>(e->t) == 2);
|
||||
REQUIRE(std::get<1>(e->t) == 3);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e;
|
||||
REQUIRE(std::is_default_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_copy_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_move_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_copy_assignable<decltype(e)>::value);
|
||||
REQUIRE(std::is_move_assignable<decltype(e)>::value);
|
||||
REQUIRE(TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(decltype(e))::value);
|
||||
REQUIRE(TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(decltype(e))::value);
|
||||
# if !defined(TL_EXPECTED_GCC49)
|
||||
REQUIRE(std::is_trivially_move_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_trivially_move_assignable<decltype(e)>::value);
|
||||
# endif
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, std::string> e;
|
||||
REQUIRE(std::is_default_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_copy_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_move_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_copy_assignable<decltype(e)>::value);
|
||||
REQUIRE(std::is_move_assignable<decltype(e)>::value);
|
||||
REQUIRE(!TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(decltype(e))::value);
|
||||
REQUIRE(!TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(decltype(e))::value);
|
||||
# if !defined(TL_EXPECTED_GCC49)
|
||||
REQUIRE(!std::is_trivially_move_constructible<decltype(e)>::value);
|
||||
REQUIRE(!std::is_trivially_move_assignable<decltype(e)>::value);
|
||||
# endif
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<std::string, int> e;
|
||||
REQUIRE(std::is_default_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_copy_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_move_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_copy_assignable<decltype(e)>::value);
|
||||
REQUIRE(std::is_move_assignable<decltype(e)>::value);
|
||||
REQUIRE(!TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(decltype(e))::value);
|
||||
REQUIRE(!TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(decltype(e))::value);
|
||||
# if !defined(TL_EXPECTED_GCC49)
|
||||
REQUIRE(!std::is_trivially_move_constructible<decltype(e)>::value);
|
||||
REQUIRE(!std::is_trivially_move_assignable<decltype(e)>::value);
|
||||
# endif
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<std::string, std::string> e;
|
||||
REQUIRE(std::is_default_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_copy_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_move_constructible<decltype(e)>::value);
|
||||
REQUIRE(std::is_copy_assignable<decltype(e)>::value);
|
||||
REQUIRE(std::is_move_assignable<decltype(e)>::value);
|
||||
REQUIRE(!TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(decltype(e))::value);
|
||||
REQUIRE(!TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(decltype(e))::value);
|
||||
# if !defined(TL_EXPECTED_GCC49)
|
||||
REQUIRE(!std::is_trivially_move_constructible<decltype(e)>::value);
|
||||
REQUIRE(!std::is_trivially_move_assignable<decltype(e)>::value);
|
||||
# endif
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<void,int> e;
|
||||
REQUIRE(e);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<void,int> e (tl::unexpect, 42);
|
||||
REQUIRE(!e);
|
||||
REQUIRE(e.error() == 42);
|
||||
}
|
||||
}
|
||||
50
Telegram/ThirdParty/expected/tests/emplace.cpp
vendored
Normal file
50
Telegram/ThirdParty/expected/tests/emplace.cpp
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
#include <catch2/catch.hpp>
|
||||
#include <tl/expected.hpp>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <tuple>
|
||||
|
||||
namespace {
|
||||
struct takes_init_and_variadic {
|
||||
std::vector<int> v;
|
||||
std::tuple<int, int> t;
|
||||
template <class... Args>
|
||||
takes_init_and_variadic(std::initializer_list<int> l, Args &&... args)
|
||||
: v(l), t(std::forward<Args>(args)...) {}
|
||||
};
|
||||
}
|
||||
|
||||
TEST_CASE("Emplace", "[emplace]") {
|
||||
{
|
||||
tl::expected<std::unique_ptr<int>,int> e;
|
||||
e.emplace(new int{42});
|
||||
REQUIRE(e);
|
||||
REQUIRE(**e == 42);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<std::vector<int>,int> e;
|
||||
e.emplace({0,1});
|
||||
REQUIRE(e);
|
||||
REQUIRE((*e)[0] == 0);
|
||||
REQUIRE((*e)[1] == 1);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<std::tuple<int,int>,int> e;
|
||||
e.emplace(2,3);
|
||||
REQUIRE(e);
|
||||
REQUIRE(std::get<0>(*e) == 2);
|
||||
REQUIRE(std::get<1>(*e) == 3);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<takes_init_and_variadic,int> e = tl::make_unexpected(0);
|
||||
e.emplace({0,1}, 2, 3);
|
||||
REQUIRE(e);
|
||||
REQUIRE(e->v[0] == 0);
|
||||
REQUIRE(e->v[1] == 1);
|
||||
REQUIRE(std::get<0>(e->t) == 2);
|
||||
REQUIRE(std::get<1>(e->t) == 3);
|
||||
}
|
||||
}
|
||||
830
Telegram/ThirdParty/expected/tests/extensions.cpp
vendored
Normal file
830
Telegram/ThirdParty/expected/tests/extensions.cpp
vendored
Normal file
@@ -0,0 +1,830 @@
|
||||
#include <catch2/catch.hpp>
|
||||
#include <tl/expected.hpp>
|
||||
|
||||
#define TOKENPASTE(x, y) x##y
|
||||
#define TOKENPASTE2(x, y) TOKENPASTE(x, y)
|
||||
#undef STATIC_REQUIRE
|
||||
#define STATIC_REQUIRE(e) \
|
||||
constexpr bool TOKENPASTE2(rqure, __LINE__) = e; \
|
||||
(void)TOKENPASTE2(rqure, __LINE__); \
|
||||
REQUIRE(e);
|
||||
|
||||
TEST_CASE("Map extensions", "[extensions.map]") {
|
||||
auto mul2 = [](int a) { return a * 2; };
|
||||
auto ret_void = [](int a) { (void)a; };
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = e.map(mul2);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 42);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = e.map(mul2);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 42);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).map(mul2);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 42);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).map(mul2);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 42);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.map(mul2);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.map(mul2);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).map(mul2);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).map(mul2);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = e.map(ret_void);
|
||||
REQUIRE(ret);
|
||||
STATIC_REQUIRE(
|
||||
(std::is_same<decltype(ret), tl::expected<void, int>>::value));
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = e.map(ret_void);
|
||||
REQUIRE(ret);
|
||||
STATIC_REQUIRE(
|
||||
(std::is_same<decltype(ret), tl::expected<void, int>>::value));
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).map(ret_void);
|
||||
REQUIRE(ret);
|
||||
STATIC_REQUIRE(
|
||||
(std::is_same<decltype(ret), tl::expected<void, int>>::value));
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).map(ret_void);
|
||||
REQUIRE(ret);
|
||||
STATIC_REQUIRE(
|
||||
(std::is_same<decltype(ret), tl::expected<void, int>>::value));
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.map(ret_void);
|
||||
REQUIRE(!ret);
|
||||
STATIC_REQUIRE(
|
||||
(std::is_same<decltype(ret), tl::expected<void, int>>::value));
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.map(ret_void);
|
||||
REQUIRE(!ret);
|
||||
STATIC_REQUIRE(
|
||||
(std::is_same<decltype(ret), tl::expected<void, int>>::value));
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).map(ret_void);
|
||||
REQUIRE(!ret);
|
||||
STATIC_REQUIRE(
|
||||
(std::is_same<decltype(ret), tl::expected<void, int>>::value));
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).map(ret_void);
|
||||
REQUIRE(!ret);
|
||||
STATIC_REQUIRE(
|
||||
(std::is_same<decltype(ret), tl::expected<void, int>>::value));
|
||||
}
|
||||
|
||||
|
||||
// mapping functions which return references
|
||||
{
|
||||
tl::expected<int, int> e(42);
|
||||
auto ret = e.map([](int& i) -> int& { return i; });
|
||||
REQUIRE(ret);
|
||||
REQUIRE(ret == 42);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("Map error extensions", "[extensions.map_error]") {
|
||||
auto mul2 = [](int a) { return a * 2; };
|
||||
auto ret_void = [](int a) { (void)a; };
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = e.map_error(mul2);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 21);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = e.map_error(mul2);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).map_error(mul2);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 21);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).map_error(mul2);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.map_error(mul2);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 42);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.map_error(mul2);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 42);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).map_error(mul2);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 42);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).map_error(mul2);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 42);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = e.map_error(ret_void);
|
||||
REQUIRE(ret);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = e.map_error(ret_void);
|
||||
REQUIRE(ret);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).map_error(ret_void);
|
||||
REQUIRE(ret);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).map_error(ret_void);
|
||||
REQUIRE(ret);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.map_error(ret_void);
|
||||
REQUIRE(!ret);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.map_error(ret_void);
|
||||
REQUIRE(!ret);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).map_error(ret_void);
|
||||
REQUIRE(!ret);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).map_error(ret_void);
|
||||
REQUIRE(!ret);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
TEST_CASE("And then extensions", "[extensions.and_then]") {
|
||||
auto succeed = [](int a) { (void)a; return tl::expected<int, int>(21 * 2); };
|
||||
auto fail = [](int a) { (void)a; return tl::expected<int, int>(tl::unexpect, 17); };
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = e.and_then(succeed);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 42);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = e.and_then(succeed);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 42);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).and_then(succeed);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 42);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).and_then(succeed);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 42);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = e.and_then(fail);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 17);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = e.and_then(fail);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 17);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).and_then(fail);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 17);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).and_then(fail);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 17);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.and_then(succeed);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.and_then(succeed);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).and_then(succeed);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).and_then(succeed);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.and_then(fail);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.and_then(fail);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).and_then(fail);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).and_then(fail);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("or_else", "[extensions.or_else]") {
|
||||
using eptr = std::unique_ptr<int>;
|
||||
auto succeed = [](int a) { (void)a; return tl::expected<int, int>(21 * 2); };
|
||||
auto succeedptr = [](eptr e) { (void)e; return tl::expected<int,eptr>(21*2);};
|
||||
auto fail = [](int a) { (void)a; return tl::expected<int,int>(tl::unexpect, 17);};
|
||||
auto failptr = [](eptr e) { *e = 17;return tl::expected<int,eptr>(tl::unexpect, std::move(e));};
|
||||
auto failvoid = [](int) {};
|
||||
auto failvoidptr = [](const eptr&) { /* don't consume */};
|
||||
auto consumeptr = [](eptr) {};
|
||||
auto make_u_int = [](int n) { return std::unique_ptr<int>(new int(n));};
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = e.or_else(succeed);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 21);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = e.or_else(succeed);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).or_else(succeed);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, eptr> e = 21;
|
||||
auto ret = std::move(e).or_else(succeedptr);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 21);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).or_else(succeed);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = e.or_else(fail);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 21);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = e.or_else(fail);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).or_else(fail);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(ret == 21);
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
tl::expected<int, eptr> e = 21;
|
||||
auto ret = std::move(e).or_else(failptr);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(ret == 21);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).or_else(fail);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.or_else(succeed);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 42);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.or_else(succeed);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 42);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).or_else(succeed);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 42);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, eptr> e(tl::unexpect, make_u_int(21));
|
||||
auto ret = std::move(e).or_else(succeedptr);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 42);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).or_else(succeed);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 42);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.or_else(fail);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 17);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.or_else(failvoid);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.or_else(fail);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 17);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.or_else(failvoid);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).or_else(fail);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 17);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).or_else(failvoid);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, eptr> e(tl::unexpect, make_u_int(21));
|
||||
auto ret = std::move(e).or_else(failvoidptr);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(*ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, eptr> e(tl::unexpect, make_u_int(21));
|
||||
auto ret = std::move(e).or_else(consumeptr);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == nullptr);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).or_else(fail);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 17);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).or_else(failvoid);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
TEST_CASE("Transform extensions", "[extensions.tronsfarm]") {
|
||||
auto mul2 = [](int a) { return a * 2; };
|
||||
auto ret_void = [](int a) { (void)a; };
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = e.transform(mul2);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 42);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = e.transform(mul2);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 42);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).transform(mul2);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 42);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).transform(mul2);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 42);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.transform(mul2);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.transform(mul2);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).transform(mul2);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).transform(mul2);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = e.transform(ret_void);
|
||||
REQUIRE(ret);
|
||||
STATIC_REQUIRE(
|
||||
(std::is_same<decltype(ret), tl::expected<void, int>>::value));
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = e.transform(ret_void);
|
||||
REQUIRE(ret);
|
||||
STATIC_REQUIRE(
|
||||
(std::is_same<decltype(ret), tl::expected<void, int>>::value));
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).transform(ret_void);
|
||||
REQUIRE(ret);
|
||||
STATIC_REQUIRE(
|
||||
(std::is_same<decltype(ret), tl::expected<void, int>>::value));
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).transform(ret_void);
|
||||
REQUIRE(ret);
|
||||
STATIC_REQUIRE(
|
||||
(std::is_same<decltype(ret), tl::expected<void, int>>::value));
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.transform(ret_void);
|
||||
REQUIRE(!ret);
|
||||
STATIC_REQUIRE(
|
||||
(std::is_same<decltype(ret), tl::expected<void, int>>::value));
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.transform(ret_void);
|
||||
REQUIRE(!ret);
|
||||
STATIC_REQUIRE(
|
||||
(std::is_same<decltype(ret), tl::expected<void, int>>::value));
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).transform(ret_void);
|
||||
REQUIRE(!ret);
|
||||
STATIC_REQUIRE(
|
||||
(std::is_same<decltype(ret), tl::expected<void, int>>::value));
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).transform(ret_void);
|
||||
REQUIRE(!ret);
|
||||
STATIC_REQUIRE(
|
||||
(std::is_same<decltype(ret), tl::expected<void, int>>::value));
|
||||
}
|
||||
|
||||
|
||||
// mapping functions which return references
|
||||
{
|
||||
tl::expected<int, int> e(42);
|
||||
auto ret = e.transform([](int& i) -> int& { return i; });
|
||||
REQUIRE(ret);
|
||||
REQUIRE(ret == 42);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("Transform error extensions", "[extensions.transform_error]") {
|
||||
auto mul2 = [](int a) { return a * 2; };
|
||||
auto ret_void = [](int a) { (void)a; };
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = e.transform_error(mul2);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 21);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = e.transform_error(mul2);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).transform_error(mul2);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 21);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).transform_error(mul2);
|
||||
REQUIRE(ret);
|
||||
REQUIRE(*ret == 21);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.transform_error(mul2);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 42);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.transform_error(mul2);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 42);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).transform_error(mul2);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 42);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).transform_error(mul2);
|
||||
REQUIRE(!ret);
|
||||
REQUIRE(ret.error() == 42);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = e.transform_error(ret_void);
|
||||
REQUIRE(ret);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = e.transform_error(ret_void);
|
||||
REQUIRE(ret);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).transform_error(ret_void);
|
||||
REQUIRE(ret);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e = 21;
|
||||
auto ret = std::move(e).transform_error(ret_void);
|
||||
REQUIRE(ret);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.transform_error(ret_void);
|
||||
REQUIRE(!ret);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = e.transform_error(ret_void);
|
||||
REQUIRE(!ret);
|
||||
}
|
||||
|
||||
{
|
||||
tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).transform_error(ret_void);
|
||||
REQUIRE(!ret);
|
||||
}
|
||||
|
||||
{
|
||||
const tl::expected<int, int> e(tl::unexpect, 21);
|
||||
auto ret = std::move(e).transform_error(ret_void);
|
||||
REQUIRE(!ret);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
struct S {
|
||||
int x;
|
||||
};
|
||||
|
||||
struct F {
|
||||
int x;
|
||||
};
|
||||
|
||||
TEST_CASE("14", "[issue.14]") {
|
||||
auto res = tl::expected<S,F>{tl::unexpect, F{}};
|
||||
|
||||
res.map_error([](F f) {
|
||||
(void)f;
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("32", "[issue.32]") {
|
||||
int i = 0;
|
||||
tl::expected<void, int> a;
|
||||
a.map([&i]{i = 42;});
|
||||
REQUIRE(i == 42);
|
||||
|
||||
auto x = a.map([]{return 42;});
|
||||
REQUIRE(*x == 42);
|
||||
}
|
||||
195
Telegram/ThirdParty/expected/tests/issues.cpp
vendored
Normal file
195
Telegram/ThirdParty/expected/tests/issues.cpp
vendored
Normal file
@@ -0,0 +1,195 @@
|
||||
#include <catch2/catch.hpp>
|
||||
#include <tl/expected.hpp>
|
||||
|
||||
#include <string>
|
||||
#include <memory>
|
||||
|
||||
using std::string;
|
||||
|
||||
tl::expected<int, string> getInt3(int val) { return val; }
|
||||
|
||||
tl::expected<int, string> getInt2(int val) { return val; }
|
||||
|
||||
tl::expected<int, string> getInt1() { return getInt2(5).and_then(getInt3); }
|
||||
|
||||
TEST_CASE("Issue 1", "[issues.1]") { getInt1(); }
|
||||
|
||||
tl::expected<int, int> operation1() { return 42; }
|
||||
|
||||
tl::expected<std::string, int> operation2(int const val) { (void)val; return "Bananas"; }
|
||||
|
||||
TEST_CASE("Issue 17", "[issues.17]") {
|
||||
auto const intermediate_result = operation1();
|
||||
|
||||
intermediate_result.and_then(operation2);
|
||||
}
|
||||
|
||||
struct a {};
|
||||
struct b : a {};
|
||||
|
||||
auto doit() -> tl::expected<std::unique_ptr<b>, int> {
|
||||
return tl::make_unexpected(0);
|
||||
}
|
||||
|
||||
TEST_CASE("Issue 23", "[issues.23]") {
|
||||
tl::expected<std::unique_ptr<a>, int> msg = doit();
|
||||
REQUIRE(!msg.has_value());
|
||||
}
|
||||
|
||||
TEST_CASE("Issue 26", "[issues.26]") {
|
||||
tl::expected<a, int> exp = tl::expected<b, int>(tl::unexpect, 0);
|
||||
REQUIRE(!exp.has_value());
|
||||
}
|
||||
|
||||
struct foo {
|
||||
foo() = default;
|
||||
foo(foo &) = delete;
|
||||
foo(foo &&){};
|
||||
};
|
||||
|
||||
TEST_CASE("Issue 29", "[issues.29]") {
|
||||
std::vector<foo> v;
|
||||
v.emplace_back();
|
||||
tl::expected<std::vector<foo>, int> ov = std::move(v);
|
||||
REQUIRE(ov->size() == 1);
|
||||
}
|
||||
|
||||
tl::expected<int, std::string> error() {
|
||||
return tl::make_unexpected(std::string("error1 "));
|
||||
}
|
||||
std::string maperror(std::string s) { return s + "maperror "; }
|
||||
|
||||
TEST_CASE("Issue 30", "[issues.30]") {
|
||||
error().map_error(maperror);
|
||||
}
|
||||
|
||||
struct i31{
|
||||
int i;
|
||||
};
|
||||
TEST_CASE("Issue 31", "[issues.31]") {
|
||||
const tl::expected<i31, int> a = i31{42};
|
||||
(void)a->i;
|
||||
|
||||
tl::expected< void, std::string > result;
|
||||
tl::expected< void, std::string > result2 = result;
|
||||
result2 = result;
|
||||
}
|
||||
|
||||
TEST_CASE("Issue 33", "[issues.33]") {
|
||||
tl::expected<void, int> res {tl::unexpect, 0};
|
||||
REQUIRE(!res);
|
||||
res = res.map_error([](int i) { (void)i; return 42; });
|
||||
REQUIRE(res.error() == 42);
|
||||
}
|
||||
|
||||
|
||||
tl::expected<void, std::string> voidWork() { return {}; }
|
||||
tl::expected<int, std::string> work2() { return 42; }
|
||||
void errorhandling(std::string){}
|
||||
|
||||
TEST_CASE("Issue 34", "[issues.34]") {
|
||||
tl::expected <int, std::string> result = voidWork ()
|
||||
.and_then (work2);
|
||||
result.map_error ([&] (std::string result) {errorhandling (result);});
|
||||
}
|
||||
|
||||
struct non_copyable {
|
||||
non_copyable(non_copyable&&) = default;
|
||||
non_copyable(non_copyable const&) = delete;
|
||||
non_copyable() = default;
|
||||
};
|
||||
|
||||
TEST_CASE("Issue 42", "[issues.42]") {
|
||||
tl::expected<non_copyable,int>{}.map([](non_copyable) {});
|
||||
}
|
||||
|
||||
TEST_CASE("Issue 43", "[issues.43]") {
|
||||
auto result = tl::expected<void, std::string>{};
|
||||
result = tl::make_unexpected(std::string{ "foo" });
|
||||
}
|
||||
|
||||
#if !(__GNUC__ <= 5)
|
||||
#include <memory>
|
||||
|
||||
using MaybeDataPtr = tl::expected<int, std::unique_ptr<int>>;
|
||||
|
||||
MaybeDataPtr test(int i) noexcept
|
||||
{
|
||||
return std::move(i);
|
||||
}
|
||||
|
||||
MaybeDataPtr test2(int i) noexcept
|
||||
{
|
||||
return std::move(i);
|
||||
}
|
||||
|
||||
TEST_CASE("Issue 49", "[issues.49]") {
|
||||
auto m = test(10)
|
||||
.and_then(test2);
|
||||
}
|
||||
#endif
|
||||
|
||||
tl::expected<int, std::unique_ptr<std::string>> func()
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
TEST_CASE("Issue 61", "[issues.61]") {
|
||||
REQUIRE(func().value() == 1);
|
||||
}
|
||||
|
||||
struct move_tracker {
|
||||
int moved = 0;
|
||||
|
||||
move_tracker() = default;
|
||||
|
||||
move_tracker(move_tracker const &other) noexcept {};
|
||||
move_tracker(move_tracker &&orig) noexcept
|
||||
: moved(orig.moved + 1) {}
|
||||
|
||||
move_tracker &
|
||||
operator=(move_tracker const &other) noexcept {};
|
||||
|
||||
move_tracker &operator=(move_tracker &&orig) noexcept {
|
||||
moved = orig.moved + 1;
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
TEST_CASE("Issue 122", "[issues.122]") {
|
||||
tl::expected<move_tracker, int> res;
|
||||
res.emplace();
|
||||
REQUIRE(res.value().moved == 0);
|
||||
}
|
||||
|
||||
#ifdef __cpp_deduction_guides
|
||||
TEST_CASE("Issue 89", "[issues.89]") {
|
||||
auto s = tl::unexpected("Some string");
|
||||
REQUIRE(s.value() == std::string("Some string"));
|
||||
}
|
||||
#endif
|
||||
|
||||
struct S {
|
||||
int i = 0;
|
||||
int j = 0;
|
||||
S(int i) : i(i) {}
|
||||
S(int i, int j) : i(i), j(j) {}
|
||||
};
|
||||
|
||||
TEST_CASE("Issue 107", "[issues.107]") {
|
||||
tl::expected<int, S> ex1(tl::unexpect, 2);
|
||||
tl::expected<int, S> ex2(tl::unexpect, 2, 2);
|
||||
|
||||
REQUIRE(ex1.error().i == 2);
|
||||
REQUIRE(ex1.error().j == 0);
|
||||
REQUIRE(ex2.error().i == 2);
|
||||
REQUIRE(ex2.error().j == 2);
|
||||
}
|
||||
|
||||
TEST_CASE("Issue 129", "[issues.129]") {
|
||||
tl::expected<std::unique_ptr<int>, int> x1 {std::unique_ptr<int>(new int(4))};
|
||||
tl::expected<std::unique_ptr<int>, int> y1 {std::unique_ptr<int>(new int(2))};
|
||||
x1 = std::move(y1);
|
||||
|
||||
REQUIRE(**x1 == 2);
|
||||
}
|
||||
2
Telegram/ThirdParty/expected/tests/main.cpp
vendored
Normal file
2
Telegram/ThirdParty/expected/tests/main.cpp
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
#define CATCH_CONFIG_MAIN
|
||||
#include <catch2/catch.hpp>
|
||||
6
Telegram/ThirdParty/expected/tests/noexcept.cpp
vendored
Normal file
6
Telegram/ThirdParty/expected/tests/noexcept.cpp
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
#include <catch2/catch.hpp>
|
||||
#include <tl/expected.hpp>
|
||||
|
||||
TEST_CASE("Noexcept", "[noexcept]") {
|
||||
//TODO
|
||||
}
|
||||
36
Telegram/ThirdParty/expected/tests/observers.cpp
vendored
Normal file
36
Telegram/ThirdParty/expected/tests/observers.cpp
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
#include <catch2/catch.hpp>
|
||||
#include <tl/expected.hpp>
|
||||
|
||||
struct move_detector {
|
||||
move_detector() = default;
|
||||
move_detector(move_detector &&rhs) { rhs.been_moved = true; }
|
||||
bool been_moved = false;
|
||||
};
|
||||
|
||||
TEST_CASE("Observers", "[observers]") {
|
||||
tl::expected<int,int> o1 = 42;
|
||||
tl::expected<int,int> o2 {tl::unexpect, 0};
|
||||
const tl::expected<int,int> o3 = 42;
|
||||
|
||||
REQUIRE(*o1 == 42);
|
||||
REQUIRE(*o1 == o1.value());
|
||||
REQUIRE(o2.value_or(42) == 42);
|
||||
REQUIRE(o2.error() == 0);
|
||||
REQUIRE(o3.value() == 42);
|
||||
auto success = std::is_same<decltype(o1.value()), int &>::value;
|
||||
REQUIRE(success);
|
||||
success = std::is_same<decltype(o3.value()), const int &>::value;
|
||||
REQUIRE(success);
|
||||
success = std::is_same<decltype(std::move(o1).value()), int &&>::value;
|
||||
REQUIRE(success);
|
||||
|
||||
#ifndef TL_EXPECTED_NO_CONSTRR
|
||||
success = std::is_same<decltype(std::move(o3).value()), const int &&>::value;
|
||||
REQUIRE(success);
|
||||
#endif
|
||||
|
||||
tl::expected<move_detector,int> o4{tl::in_place};
|
||||
move_detector o5 = std::move(o4).value();
|
||||
REQUIRE(o4->been_moved);
|
||||
REQUIRE(!o5.been_moved);
|
||||
}
|
||||
17
Telegram/ThirdParty/expected/tests/relops.cpp
vendored
Normal file
17
Telegram/ThirdParty/expected/tests/relops.cpp
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
#include <catch2/catch.hpp>
|
||||
#include <tl/expected.hpp>
|
||||
|
||||
TEST_CASE("Relational operators", "[relops]") {
|
||||
tl::expected<int, int> o1 = 42;
|
||||
tl::expected<int, int> o2{tl::unexpect, 0};
|
||||
const tl::expected<int, int> o3 = 42;
|
||||
|
||||
REQUIRE(o1 == o1);
|
||||
REQUIRE(o1 != o2);
|
||||
REQUIRE(o1 == o3);
|
||||
REQUIRE(o3 == o3);
|
||||
|
||||
tl::expected<void, int> o6;
|
||||
|
||||
REQUIRE(o6 == o6);
|
||||
}
|
||||
107
Telegram/ThirdParty/expected/tests/swap.cpp
vendored
Normal file
107
Telegram/ThirdParty/expected/tests/swap.cpp
vendored
Normal file
@@ -0,0 +1,107 @@
|
||||
#include <catch2/catch.hpp>
|
||||
#include <tl/expected.hpp>
|
||||
|
||||
struct no_throw {
|
||||
no_throw(std::string i) : i(i) {}
|
||||
std::string i;
|
||||
};
|
||||
struct canthrow_move {
|
||||
canthrow_move(std::string i) : i(i) {}
|
||||
canthrow_move(canthrow_move const &) = default;
|
||||
canthrow_move(canthrow_move &&other) noexcept(false) : i(other.i) {}
|
||||
canthrow_move &operator=(canthrow_move &&) = default;
|
||||
std::string i;
|
||||
};
|
||||
|
||||
bool should_throw = false;
|
||||
|
||||
#ifdef TL_EXPECTED_EXCEPTIONS_ENABLED
|
||||
struct willthrow_move {
|
||||
willthrow_move(std::string i) : i(i) {}
|
||||
willthrow_move(willthrow_move const &) = default;
|
||||
willthrow_move(willthrow_move &&other) : i(other.i) {
|
||||
if (should_throw)
|
||||
throw 0;
|
||||
}
|
||||
willthrow_move &operator=(willthrow_move &&) = default;
|
||||
std::string i;
|
||||
};
|
||||
#endif // TL_EXPECTED_EXCEPTIONS_ENABLED
|
||||
|
||||
static_assert(tl::detail::is_swappable<no_throw>::value, "");
|
||||
|
||||
template <class T1, class T2> void swap_test() {
|
||||
std::string s1 = "abcdefghijklmnopqrstuvwxyz";
|
||||
std::string s2 = "zyxwvutsrqponmlkjihgfedcba";
|
||||
|
||||
tl::expected<T1, T2> a{s1};
|
||||
tl::expected<T1, T2> b{s2};
|
||||
swap(a, b);
|
||||
REQUIRE(a->i == s2);
|
||||
REQUIRE(b->i == s1);
|
||||
|
||||
a = s1;
|
||||
b = tl::unexpected<T2>(s2);
|
||||
swap(a, b);
|
||||
REQUIRE(a.error().i == s2);
|
||||
REQUIRE(b->i == s1);
|
||||
|
||||
a = tl::unexpected<T2>(s1);
|
||||
b = s2;
|
||||
swap(a, b);
|
||||
REQUIRE(a->i == s2);
|
||||
REQUIRE(b.error().i == s1);
|
||||
|
||||
a = tl::unexpected<T2>(s1);
|
||||
b = tl::unexpected<T2>(s2);
|
||||
swap(a, b);
|
||||
REQUIRE(a.error().i == s2);
|
||||
REQUIRE(b.error().i == s1);
|
||||
|
||||
a = s1;
|
||||
b = s2;
|
||||
a.swap(b);
|
||||
REQUIRE(a->i == s2);
|
||||
REQUIRE(b->i == s1);
|
||||
|
||||
a = s1;
|
||||
b = tl::unexpected<T2>(s2);
|
||||
a.swap(b);
|
||||
REQUIRE(a.error().i == s2);
|
||||
REQUIRE(b->i == s1);
|
||||
|
||||
a = tl::unexpected<T2>(s1);
|
||||
b = s2;
|
||||
a.swap(b);
|
||||
REQUIRE(a->i == s2);
|
||||
REQUIRE(b.error().i == s1);
|
||||
|
||||
a = tl::unexpected<T2>(s1);
|
||||
b = tl::unexpected<T2>(s2);
|
||||
a.swap(b);
|
||||
REQUIRE(a.error().i == s2);
|
||||
REQUIRE(b.error().i == s1);
|
||||
}
|
||||
|
||||
#ifdef TL_EXPECTED_EXCEPTIONS_ENABLED
|
||||
TEST_CASE("swap") {
|
||||
|
||||
swap_test<no_throw, no_throw>();
|
||||
swap_test<no_throw, canthrow_move>();
|
||||
swap_test<canthrow_move, no_throw>();
|
||||
|
||||
std::string s1 = "abcdefghijklmnopqrstuvwxyz";
|
||||
std::string s2 = "zyxwvutsrqponmlkjihgfedcbaxxx";
|
||||
tl::expected<no_throw, willthrow_move> a{s1};
|
||||
tl::expected<no_throw, willthrow_move> b{tl::unexpect, s2};
|
||||
should_throw = 1;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
//this seems to break catch on GCC and Clang
|
||||
REQUIRE_THROWS(swap(a, b));
|
||||
#endif
|
||||
|
||||
REQUIRE(a->i == s1);
|
||||
REQUIRE(b.error().i == s2);
|
||||
}
|
||||
#endif // TL_EXPECTED_EXCEPTIONS_ENABLED
|
||||
32
Telegram/ThirdParty/expected/tests/test.cpp
vendored
Normal file
32
Telegram/ThirdParty/expected/tests/test.cpp
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
struct no_throw {
|
||||
no_throw(std::string i) : i(i) {}
|
||||
std::string i;
|
||||
};
|
||||
struct canthrow_move {
|
||||
canthrow_move(std::string i) : i(i) {}
|
||||
canthrow_move(canthrow_move const &) = default;
|
||||
canthrow_move(canthrow_move &&other) noexcept(false) : i(other.i) {}
|
||||
canthrow_move &operator=(canthrow_move &&) = default;
|
||||
std::string i;
|
||||
};
|
||||
|
||||
bool should_throw = false;
|
||||
struct willthrow_move {
|
||||
willthrow_move(std::string i) : i(i) {}
|
||||
willthrow_move(willthrow_move const &) = default;
|
||||
willthrow_move(willthrow_move &&other) : i(other.i) {
|
||||
if (should_throw)
|
||||
throw 0;
|
||||
}
|
||||
willthrow_move &operator=(willthrow_move &&) = default;
|
||||
std::string i;
|
||||
};
|
||||
|
||||
int main() {
|
||||
std::string s1 = "abcdefghijklmnopqrstuvwxyz";
|
||||
std::string s2 = "zyxwvutsrqponmlkjihgfedcbaxxx";
|
||||
tl::expected<no_throw, willthrow_move> a{s1};
|
||||
tl::expected<no_throw, willthrow_move> b{tl::unexpect, s2};
|
||||
should_throw = 1;
|
||||
swap(a, b);
|
||||
}
|
||||
Reference in New Issue
Block a user