/ src / core_memusage.h
core_memusage.h
 1  // Copyright (c) 2015-2018 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  static inline size_t RecursiveDynamicUsage(const CScript& script) {
13      return memusage::DynamicUsage(script);
14  }
15  
16  static inline size_t RecursiveDynamicUsage(const COutPoint& out) {
17      return 0;
18  }
19  
20  static inline size_t RecursiveDynamicUsage(const CTxIn& in) {
21      size_t mem = RecursiveDynamicUsage(in.scriptSig) + RecursiveDynamicUsage(in.prevout) + memusage::DynamicUsage(in.scriptWitness.stack);
22      for (std::vector<std::vector<unsigned char> >::const_iterator it = in.scriptWitness.stack.begin(); it != in.scriptWitness.stack.end(); it++) {
23           mem += memusage::DynamicUsage(*it);
24      }
25      return mem;
26  }
27  
28  static inline size_t RecursiveDynamicUsage(const CTxOut& out) {
29      return RecursiveDynamicUsage(out.scriptPubKey);
30  }
31  
32  static inline size_t RecursiveDynamicUsage(const CTransaction& tx) {
33      size_t mem = memusage::DynamicUsage(tx.vin) + memusage::DynamicUsage(tx.vout);
34      for (std::vector<CTxIn>::const_iterator it = tx.vin.begin(); it != tx.vin.end(); it++) {
35          mem += RecursiveDynamicUsage(*it);
36      }
37      for (std::vector<CTxOut>::const_iterator it = tx.vout.begin(); it != tx.vout.end(); it++) {
38          mem += RecursiveDynamicUsage(*it);
39      }
40      return mem;
41  }
42  
43  static inline size_t RecursiveDynamicUsage(const CMutableTransaction& tx) {
44      size_t mem = memusage::DynamicUsage(tx.vin) + memusage::DynamicUsage(tx.vout);
45      for (std::vector<CTxIn>::const_iterator it = tx.vin.begin(); it != tx.vin.end(); it++) {
46          mem += RecursiveDynamicUsage(*it);
47      }
48      for (std::vector<CTxOut>::const_iterator it = tx.vout.begin(); it != tx.vout.end(); it++) {
49          mem += RecursiveDynamicUsage(*it);
50      }
51      return mem;
52  }
53  
54  static inline size_t RecursiveDynamicUsage(const CBlock& block) {
55      size_t mem = memusage::DynamicUsage(block.vtx);
56      for (const auto& tx : block.vtx) {
57          mem += memusage::DynamicUsage(tx) + RecursiveDynamicUsage(*tx);
58      }
59      return mem;
60  }
61  
62  static inline size_t RecursiveDynamicUsage(const CBlockLocator& locator) {
63      return memusage::DynamicUsage(locator.vHave);
64  }
65  
66  template<typename X>
67  static inline size_t RecursiveDynamicUsage(const std::shared_ptr<X>& p) {
68      return p ? memusage::DynamicUsage(p) + RecursiveDynamicUsage(*p) : 0;
69  }
70  
71  #endif // BITCOIN_CORE_MEMUSAGE_H