From b11b9939f4f06fa793648d75c3c2d3e4d82cdbf9 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Sun, 28 Jun 2015 16:07:33 -0700 Subject: [PATCH] Add contract interface --- Builds/VisualStudio2013/RippleD.vcxproj | 4 ++ .../VisualStudio2013/RippleD.vcxproj.filters | 3 + src/ripple/basics/contract.h | 64 +++++++++++++++++++ src/ripple/basics/impl/contract.cpp | 52 +++++++++++++++ src/ripple/unity/basics.cpp | 1 + 5 files changed, 124 insertions(+) create mode 100644 src/ripple/basics/contract.h create mode 100644 src/ripple/basics/impl/contract.cpp diff --git a/Builds/VisualStudio2013/RippleD.vcxproj b/Builds/VisualStudio2013/RippleD.vcxproj index 669533588e..303da0ca90 100644 --- a/Builds/VisualStudio2013/RippleD.vcxproj +++ b/Builds/VisualStudio2013/RippleD.vcxproj @@ -1885,6 +1885,10 @@ + + True + True + True True diff --git a/Builds/VisualStudio2013/RippleD.vcxproj.filters b/Builds/VisualStudio2013/RippleD.vcxproj.filters index bb2a49d0f4..2d32fa1b4c 100644 --- a/Builds/VisualStudio2013/RippleD.vcxproj.filters +++ b/Builds/VisualStudio2013/RippleD.vcxproj.filters @@ -2616,6 +2616,9 @@ ripple\basics\impl + + ripple\basics\impl + ripple\basics\impl diff --git a/src/ripple/basics/contract.h b/src/ripple/basics/contract.h new file mode 100644 index 0000000000..a4a7a849ea --- /dev/null +++ b/src/ripple/basics/contract.h @@ -0,0 +1,64 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2014 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#ifndef RIPPLE_BASICS_CONTRACT_H_INCLUDED +#define RIPPLE_BASICS_CONTRACT_H_INCLUDED + +#include +#include +#include + +namespace ripple { + +/* Programming By Contract + + This routines are used when checking + preconditions, postconditions, and invariants. +*/ + +namespace detail { + +void +accessViolation(); + +void +throwException( + std::exception_ptr ep); + +} // detail + +template +void +Throw (Args&&... args) +{ + throwException( + std::make_exception_ptr( + Exception(std::forward< + Args>(args)...))); +} + +/** Called when faulty logic causes a broken invariant. */ +void +LogicError ( + std::string const& how); + +} // ripple + +#endif diff --git a/src/ripple/basics/impl/contract.cpp b/src/ripple/basics/impl/contract.cpp new file mode 100644 index 0000000000..e10673d33d --- /dev/null +++ b/src/ripple/basics/impl/contract.cpp @@ -0,0 +1,52 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2012, 2013 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include +#include + +namespace ripple { + +namespace detail { + +void +accessViolation() +{ + // dereference memory + // location zero + int* j = 0; + *j++; +} + +// This hook lets you do pre or post +// processing on exceptions to suit needs. +void +throwException (std::exception_ptr ep) +{ + std::rethrow_exception(ep); +} + +} // detail + +void +LogicError (std::string const&) +{ + detail::accessViolation(); +} + +} // ripple diff --git a/src/ripple/unity/basics.cpp b/src/ripple/unity/basics.cpp index 0e3ad14609..fa4da07fe7 100644 --- a/src/ripple/unity/basics.cpp +++ b/src/ripple/unity/basics.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include #include