Line data Source code
1 : // Copyright (c) 2015 The Bitcoin Core developers 2 : // Distributed under the MIT software license, see the accompanying 3 : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 : 5 : #ifndef BITCOIN_CORE_MEMUSAGE_H 6 : #define BITCOIN_CORE_MEMUSAGE_H 7 : 8 : #include <primitives/transaction.h> 9 : #include <primitives/block.h> 10 : #include <memusage.h> 11 : 12 700450 : static inline size_t RecursiveDynamicUsage(const CScript& script) { 13 700450 : return memusage::DynamicUsage(script); 14 : } 15 : 16 250304 : static inline size_t RecursiveDynamicUsage(const COutPoint& out) { 17 250304 : return 0; 18 : } 19 : 20 250304 : static inline size_t RecursiveDynamicUsage(const CTxIn& in) { 21 250304 : return RecursiveDynamicUsage(in.scriptSig) + RecursiveDynamicUsage(in.prevout); 22 : } 23 : 24 450146 : static inline size_t RecursiveDynamicUsage(const CTxOut& out) { 25 450146 : return RecursiveDynamicUsage(out.scriptPubKey); 26 : } 27 : 28 135200 : static inline size_t RecursiveDynamicUsage(const CTransaction& tx) { 29 135200 : size_t mem = memusage::DynamicUsage(tx.vin) + memusage::DynamicUsage(tx.vout); 30 385504 : for (std::vector<CTxIn>::const_iterator it = tx.vin.begin(); it != tx.vin.end(); it++) { 31 250304 : mem += RecursiveDynamicUsage(*it); 32 250304 : } 33 585346 : for (std::vector<CTxOut>::const_iterator it = tx.vout.begin(); it != tx.vout.end(); it++) { 34 450146 : mem += RecursiveDynamicUsage(*it); 35 450146 : } 36 135200 : return mem; 37 : } 38 : 39 : static inline size_t RecursiveDynamicUsage(const CMutableTransaction& tx) { 40 : size_t mem = memusage::DynamicUsage(tx.vin) + memusage::DynamicUsage(tx.vout); 41 : for (std::vector<CTxIn>::const_iterator it = tx.vin.begin(); it != tx.vin.end(); it++) { 42 : mem += RecursiveDynamicUsage(*it); 43 : } 44 : for (std::vector<CTxOut>::const_iterator it = tx.vout.begin(); it != tx.vout.end(); it++) { 45 : mem += RecursiveDynamicUsage(*it); 46 : } 47 : return mem; 48 : } 49 : 50 : static inline size_t RecursiveDynamicUsage(const CBlock& block) { 51 : size_t mem = memusage::DynamicUsage(block.vtx); 52 : for (const auto& tx : block.vtx) { 53 : mem += memusage::DynamicUsage(tx) + RecursiveDynamicUsage(*tx); 54 : } 55 : return mem; 56 : } 57 : 58 : static inline size_t RecursiveDynamicUsage(const CBlockLocator& locator) { 59 : return memusage::DynamicUsage(locator.vHave); 60 : } 61 : 62 : template<typename X> 63 135106 : static inline size_t RecursiveDynamicUsage(const std::shared_ptr<X>& p) { 64 135106 : return p ? memusage::DynamicUsage(p) + RecursiveDynamicUsage(*p) : 0; 65 : } 66 : 67 : #endif // BITCOIN_CORE_MEMUSAGE_H