#ifndef arc__validate__except_hxx_ #define arc__validate__except_hxx_ #include #include #include #include #include namespace arc::validate { class LIBARC_VALIDATE_SYMEXPORT skipped_t {}; class LIBARC_VALIDATE_SYMEXPORT not_implemented_t {}; class LIBARC_VALIDATE_SYMEXPORT failure_t { public: class LIBARC_VALIDATE_SYMEXPORT extras_t { public: template extras_t(T extras) : extras_{std::make_shared>(std::move(extras))} {} friend std::ostream& operator<<(std::ostream&, extras_t const&); private: struct concept_t { virtual ~concept_t() noexcept = default; virtual void print(std::ostream&) const = 0; }; template struct container_t : concept_t { template container_t(Args&&... args) : extras{std::forward(args)...} {} void print(std::ostream& o) const { extras.print(o); } T extras; }; std::shared_ptr extras_; }; failure_t(std::source_location, std::string, extras_t); extras_t const& extras() const; private: extras_t extras_; }; LIBARC_VALIDATE_SYMEXPORT std::ostream& operator<<(std::ostream&, failure_t::extras_t const&); } // namespace arc::validate #endif