Skip to content

Commit

Permalink
new library: throw_ex
Browse files Browse the repository at this point in the history
  • Loading branch information
iboB committed Oct 24, 2023
1 parent 748e7cf commit bee8261
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 0 deletions.
76 changes: 76 additions & 0 deletions include/itlib/throw_ex.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
// itlib-throw_ex v0.10 beta
//
// Utility to throw compose and throw exceptions on a single line
//
// SPDX-License-Identifier: MIT
// MIT License:
// Copyright(c) 2023 Borislav Stanimirov
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files(the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and / or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions :
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
//
// VERSION HISTORY
//
// 0.10 (2023-10-24) Initial release
//
//
// DOCUMENTATION
//
// Simply include this file wherever you need.
//
// TESTS
//
// You can find unit tests for mutex in its official repo:
// https://github.com/iboB/itlib/blob/master/test/
//
#pragma once
#include <sstream>

namespace itlib {

template <typename Exception>
class throw_ex {
std::ostringstream out;
public:
throw_ex() = default;
[[noreturn]] ~throw_ex() noexcept(false) {
#if __cplusplus >= 201700
if (std::uncaught_exceptions())
#else
if (std::uncaught_exception())
#endif
std::terminate(); // should never happen but helps us avoid warnings
throw Exception(out.str());
}

template <typename T>
throw_ex& operator<<(const T& t) {
out << t;
return *this;
}

// overload improve compilation time with literals
throw_ex& operator<<(const char* str) {
out << str;
return *this;
}
};

}
1 change: 1 addition & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ add_itlib_test(strutil)
add_itlib_test(small_vector)
add_itlib_test(span)
add_itlib_test(stride_span)
add_itlib_test(throw_ex)
add_itlib_test(time_t)
add_itlib_test(type_traits)
add_itlib_test(ufunction)
Expand Down
32 changes: 32 additions & 0 deletions test/t-throw_ex-11.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Copyright (c) Borislav Stanimirov
// SPDX-License-Identifier: MIT
//
#include <itlib/throw_ex.hpp>
#include <doctest/doctest.h>
#include <stdexcept>

using throw_ex = itlib::throw_ex<std::runtime_error>;

struct foo {
foo(int a, int b) : a(a), b(b) {}
int a, b;
};

std::ostream& operator<<(std::ostream& out, const foo& f) {
out << f.a << ':' << f.b;
return out;
}

TEST_CASE("throw_ex") {
CHECK_THROWS_WITH_AS(
throw_ex{} << "hello " << 42,
"hello 42",
std::runtime_error
);

CHECK_THROWS_WITH_AS(
throw_ex{} << "hello " << foo(1, 2),
"hello 1:2",
std::runtime_error
);
}

0 comments on commit bee8261

Please sign in to comment.