core_memusage.h raw
1 // Copyright (c) 2015-present 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
72