/* This file is part of solidity. solidity is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. solidity is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with solidity. If not, see . */ /** @file Common.h * @author Gav Wood * @date 2014 * * Very common stuff (i.e. that every other header needs except vector_ref.h). */ #pragma once // way too many unsigned to size_t warnings in 32 bit build #ifdef _M_IX86 #pragma warning(disable:4244) #endif #if _MSC_VER && _MSC_VER < 1900 #define _ALLOW_KEYWORD_MACROS #define noexcept throw() #endif #ifdef __INTEL_COMPILER #pragma warning(disable:3682) //call through incomplete class #endif #include #include #if (BOOST_VERSION < 106500) #error "Unsupported Boost version. At least 1.65 required." #endif #include #include #include #include #include namespace solidity { // Binary data types. using bytes = std::vector; using bytesRef = util::vector_ref; using bytesConstRef = util::vector_ref; // Numeric types. using bigint = boost::multiprecision::number>; using u256 = boost::multiprecision::number>; using s256 = boost::multiprecision::number>; using u160 = boost::multiprecision::number>; // Map types. using StringMap = std::map; // String types. using strings = std::vector; /// Interprets @a _u as a two's complement signed number and returns the resulting s256. inline s256 u2s(u256 _u) { static bigint const c_end = bigint(1) << 256; if (boost::multiprecision::bit_test(_u, 255)) return s256(-(c_end - _u)); else return s256(_u); } /// @returns the two's complement signed representation of the signed number _u. inline u256 s2u(s256 _u) { static bigint const c_end = bigint(1) << 256; if (_u >= 0) return u256(_u); else return u256(c_end + _u); } inline u256 exp256(u256 _base, u256 _exponent) { using boost::multiprecision::limb_type; u256 result = 1; while (_exponent) { if (boost::multiprecision::bit_test(_exponent, 0)) result *= _base; _base *= _base; _exponent >>= 1; } return result; } inline std::ostream& operator<<(std::ostream& os, bytes const& _bytes) { std::ostringstream ss; ss << std::hex; std::copy(_bytes.begin(), _bytes.end(), std::ostream_iterator(ss, ",")); std::string result = ss.str(); result.pop_back(); os << "[" + result + "]"; return os; } /// RAII utility class whose destructor calls a given function. class ScopeGuard { public: explicit ScopeGuard(std::function _f): m_f(_f) {} ~ScopeGuard() { m_f(); } private: std::function m_f; }; }