From 8ea8f41bba6d70ba5fef15e300f1313bc1d3a754 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Tue, 5 Feb 2019 09:08:25 -0800 Subject: [PATCH] is_file is in file_base.hpp (API Change): * The metafunction `is_file` is part of file_base.hpp Actions Required * Include file_base.hpp as needed --- CHANGELOG.md | 4 +- doc/qbk/release_notes.qbk | 13 ++-- include/boost/beast/core/file_base.hpp | 67 ++++++++++++++++++- include/boost/beast/core/type_traits.hpp | 69 -------------------- include/boost/beast/http/basic_file_body.hpp | 1 - test/beast/core/CMakeLists.txt | 1 + test/beast/core/Jamfile | 1 + test/beast/core/file_base.cpp | 11 ++++ test/beast/core/file_test.hpp | 3 +- test/beast/core/ostream.cpp | 1 + 10 files changed, 94 insertions(+), 77 deletions(-) create mode 100644 test/beast/core/file_base.cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a7a411c..862b319d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,10 +10,12 @@ Version 210: API Changes: * Stream traits are now in stream_traits.hpp +* `is_file` is now in file_base.hpp Actions Required: -* Include the file stream_traits.hpp as needed +* Include stream_traits.hpp as needed +* Include file_base.hpp as needed -------------------------------------------------------------------------------- diff --git a/doc/qbk/release_notes.qbk b/doc/qbk/release_notes.qbk index e9723f1e..9682b6e8 100644 --- a/doc/qbk/release_notes.qbk +++ b/doc/qbk/release_notes.qbk @@ -25,7 +25,7 @@ New websocket-chat-multi example ] [tip - The namespace alias `net` is now used throughout for `boost::asio`. + The namespace alias `net` is used throughout for `boost::asio`. ] [*New Features] @@ -113,23 +113,28 @@ New websocket-chat-multi example `is_async_stream`, `is_async_read_stream`, and `is_async_write_stream` - are now located in stream_traits.hpp. + are in stream_traits.hpp. ['Actions Required]: Include stream_traits.hpp as needed. +* Metafunction + `is_file` + is in file_base.hpp. + ['Actions Required]: Include file_base.hpp as needed. + * `flat_static_buffer::reset()` is deprecated. ['Actions Required]: * call `clear()` instead. -* `buffers_adapter` is now spelled +* `buffers_adapter` is spelled `buffers_adaptor`. ['Actions Required]: * Replace `buffers_adapter` with `buffers_adaptor`, or define `BOOST_BEAST_ALLOW_DEPRECATED`. -* `buffers` is now spelled +* `buffers` is spelled `make_printable`. ['Actions Required]: * Replace `buffers` with diff --git a/include/boost/beast/core/file_base.hpp b/include/boost/beast/core/file_base.hpp index 3fdb37e2..f05afce4 100644 --- a/include/boost/beast/core/file_base.hpp +++ b/include/boost/beast/core/file_base.hpp @@ -11,7 +11,9 @@ #define BOOST_BEAST_CORE_FILE_BASE_HPP #include -#include +#include +#include +#include namespace boost { namespace beast { @@ -93,6 +95,69 @@ enum class file_mode append_existing }; +/** Determine if `T` meets the requirements of @b File. + + Metafunctions are used to perform compile time checking of template + types. This type will be `std::true_type` if `T` meets the requirements, + else the type will be `std::false_type`. + + @par Example + + Use with `static_assert`: + + @code + template + void f(File& file) + { + static_assert(is_file::value, + "File requirements not met"); + ... + @endcode + + Use with `std::enable_if` (SFINAE): + + @code + template + typename std::enable_if::value>::type + f(File& file); + @endcode +*/ +#if BOOST_BEAST_DOXYGEN +template +struct is_file : std::integral_constant{}; +#else +template +struct is_file : std::false_type {}; + +template +struct is_file() = std::declval().is_open(), + std::declval().close(std::declval()), + std::declval().open( + std::declval(), + std::declval(), + std::declval()), + std::declval() = std::declval().size( + std::declval()), + std::declval() = std::declval().pos( + std::declval()), + std::declval().seek( + std::declval(), + std::declval()), + std::declval() = std::declval().read( + std::declval(), + std::declval(), + std::declval()), + std::declval() = std::declval().write( + std::declval(), + std::declval(), + std::declval()) + )>> : std::integral_constant::value && + std::is_destructible::value + > {}; +#endif + } // beast } // boost diff --git a/include/boost/beast/core/type_traits.hpp b/include/boost/beast/core/type_traits.hpp index eeafb8c4..5903ef78 100644 --- a/include/boost/beast/core/type_traits.hpp +++ b/include/boost/beast/core/type_traits.hpp @@ -56,75 +56,6 @@ using is_completion_handler = std::integral_constant::value>; #endif -//------------------------------------------------------------------------------ -// -// File concepts -// -//------------------------------------------------------------------------------ - -/** Determine if `T` meets the requirements of @b File. - - Metafunctions are used to perform compile time checking of template - types. This type will be `std::true_type` if `T` meets the requirements, - else the type will be `std::false_type`. - - @par Example - - Use with `static_assert`: - - @code - template - void f(File& file) - { - static_assert(is_file::value, - "File requirements not met"); - ... - @endcode - - Use with `std::enable_if` (SFINAE): - - @code - template - typename std::enable_if::value>::type - f(File& file); - @endcode -*/ -#if BOOST_BEAST_DOXYGEN -template -struct is_file : std::integral_constant{}; -#else -template -struct is_file : std::false_type {}; - -template -struct is_file() = std::declval().is_open(), - std::declval().close(std::declval()), - std::declval().open( - std::declval(), - std::declval(), - std::declval()), - std::declval() = std::declval().size( - std::declval()), - std::declval() = std::declval().pos( - std::declval()), - std::declval().seek( - std::declval(), - std::declval()), - std::declval() = std::declval().read( - std::declval(), - std::declval(), - std::declval()), - std::declval() = std::declval().write( - std::declval(), - std::declval(), - std::declval()) - )>> : std::integral_constant::value && - std::is_destructible::value - > {}; -#endif - } // beast } // boost diff --git a/include/boost/beast/http/basic_file_body.hpp b/include/boost/beast/http/basic_file_body.hpp index 65b92568..5fab105d 100644 --- a/include/boost/beast/http/basic_file_body.hpp +++ b/include/boost/beast/http/basic_file_body.hpp @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include diff --git a/test/beast/core/CMakeLists.txt b/test/beast/core/CMakeLists.txt index a3e711d9..eafdd189 100644 --- a/test/beast/core/CMakeLists.txt +++ b/test/beast/core/CMakeLists.txt @@ -45,6 +45,7 @@ add_executable (tests-beast-core dynamic_buffer_ref.cpp error.cpp file.cpp + file_base.cpp file_posix.cpp file_stdio.cpp file_win32.cpp diff --git a/test/beast/core/Jamfile b/test/beast/core/Jamfile index 8a36dc0e..89a4fefe 100644 --- a/test/beast/core/Jamfile +++ b/test/beast/core/Jamfile @@ -33,6 +33,7 @@ local SOURCES = dynamic_buffer_ref.cpp error.cpp file.cpp + file_base.cpp file_posix.cpp file_stdio.cpp file_win32.cpp diff --git a/test/beast/core/file_base.cpp b/test/beast/core/file_base.cpp new file mode 100644 index 00000000..a0958120 --- /dev/null +++ b/test/beast/core/file_base.cpp @@ -0,0 +1,11 @@ +// +// Copyright (c) 2019 Vinnie Falco (vinnie dot falco at gmail dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/boostorg/beast +// + +// Test that header file is self-contained. +#include diff --git a/test/beast/core/file_test.hpp b/test/beast/core/file_test.hpp index 72ad6dea..2e1debd0 100644 --- a/test/beast/core/file_test.hpp +++ b/test/beast/core/file_test.hpp @@ -10,8 +10,9 @@ #ifndef BOOST_BEAST_FILE_TEST_HPP #define BOOST_BEAST_FILE_TEST_HPP -#include #include +#include +#include #include #include #include diff --git a/test/beast/core/ostream.cpp b/test/beast/core/ostream.cpp index ccab35be..b063438c 100644 --- a/test/beast/core/ostream.cpp +++ b/test/beast/core/ostream.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include