Changeset 1610aa35 in mainline for uspace/lib/cpp/include/impl


Ignore:
Timestamp:
2018-07-05T21:41:23Z (7 years ago)
Author:
Dzejrou <dzejrou@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
17c41c3
Parents:
68cfab1
git-author:
Dzejrou <dzejrou@…> (2018-05-08 16:23:51)
git-committer:
Dzejrou <dzejrou@…> (2018-07-05 21:41:23)
Message:

cpp: added <exception>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/cpp/include/impl/exception.hpp

    r68cfab1 r1610aa35  
    3030#define LIBCPP_EXCEPTION
    3131
     32#include <internal/trycatch.hpp>
     33
    3234namespace std
    3335{
    34     [[noreturn]] void terminate() noexcept;
     36    /**
     37     * 18.8.1, class exception:
     38     */
    3539
    3640    class exception
    3741    {
    3842        public:
    39             exception() = default;
    40             exception(const exception&) = default;
    41             exception& operator=(const exception&) noexcept;
    42             virtual const char* what() const;
     43            exception() noexcept = default;
     44            exception(const exception&) noexcept = default;
     45            exception& operator=(const exception&) noexcept = default;
    4346            virtual ~exception() = default;
     47            virtual const char* what() const noexcept;
    4448    };
     49
     50    /**
     51     * 18.8.2, class bad_exception:
     52     */
     53
     54    class bad_exception: public exception
     55    {
     56        public:
     57            bad_exception() noexcept = default;
     58            bad_exception(const bad_exception&) noexcept = default;
     59            bad_exception& operator=(const bad_exception&) noexcept = default;
     60
     61            virtual const char* what() const noexcept;
     62    };
     63
     64    /**
     65     * 18.8.3, abnormal termination:
     66     */
     67
     68    using terminate_handler = void (*)();
     69
     70    terminate_handler get_terminate() noexcept;
     71    terminate_handler set_terminate(terminate_handler) noexcept;
     72    [[noreturn]] void terminate() noexcept;
     73
     74    /**
     75     * 18.8.4, uncaght_exceptions:
     76     */
     77
     78    bool uncaught_exception() noexcept;
     79    int uncaught_exceptions() noexcept;
     80
     81    using unexpected_handler = void (*)();
     82
     83    unexpected_handler get_unexpected() noexcept;
     84    unexpected_handler set_unexpected(unexpected_handler) noexcept;
     85    [[noreturn]] void unexpected();
     86
     87    /**
     88     * 18.8.5, exception propagation:
     89     */
     90
     91    namespace aux
     92    {
     93        class exception_ptr_t
     94        { /* DUMMY BODY */ };
     95    }
     96
     97    using exception_ptr = aux::exception_ptr_t;
     98
     99    exception_ptr current_exception() noexcept;
     100    [[noreturn]] void rethrow_exception(exception_ptr);
     101
     102    template<class E>
     103    exception_ptr make_exception_ptr(E e) noexcept
     104    {
     105        return exception_ptr{};
     106    }
     107
     108    class nested_exception
     109    {
     110        public:
     111            nested_exception() noexcept = default;
     112            nested_exception(const nested_exception&) noexcept = default;
     113            nested_exception& operator=(const nested_exception&) noexcept = default;
     114            virtual ~nested_exception() = default;
     115
     116            [[noreturn]] void throw_nested() const;
     117            exception_ptr nested_ptr() const noexcept;
     118
     119        private:
     120            exception_ptr ptr_;
     121    };
     122
     123    template<class E>
     124    [[noreturn]] void throw_with_nested(E&& e)
     125    {
     126        terminate();
     127    }
     128
     129    template<class E>
     130    void rethrow_if_nested(const E& e)
     131    {
     132        auto casted = dynamic_cast<const nested_exception*>(&e);
     133        if (casted)
     134            casted->throw_nested();
     135    }
    45136}
    46137
Note: See TracChangeset for help on using the changeset viewer.