Avoid boost dynamic_bitset in rest_getutxos

This commit is contained in:
Pieter Wuille 2017-01-12 12:06:32 -08:00
parent 99f001eb52
commit 82e8baab3c

View file

@ -17,7 +17,6 @@
#include "version.h" #include "version.h"
#include <boost/algorithm/string.hpp> #include <boost/algorithm/string.hpp>
#include <boost/dynamic_bitset.hpp>
#include <univalue.h> #include <univalue.h>
@ -502,7 +501,8 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart)
vector<unsigned char> bitmap; vector<unsigned char> bitmap;
vector<CCoin> outs; vector<CCoin> outs;
std::string bitmapStringRepresentation; std::string bitmapStringRepresentation;
boost::dynamic_bitset<unsigned char> hits(vOutPoints.size()); std::vector<bool> hits;
bitmap.resize((vOutPoints.size() + 7) / 8);
{ {
LOCK2(cs_main, mempool.cs); LOCK2(cs_main, mempool.cs);
@ -518,10 +518,11 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart)
for (size_t i = 0; i < vOutPoints.size(); i++) { for (size_t i = 0; i < vOutPoints.size(); i++) {
CCoins coins; CCoins coins;
uint256 hash = vOutPoints[i].hash; uint256 hash = vOutPoints[i].hash;
bool hit = false;
if (view.GetCoins(hash, coins)) { if (view.GetCoins(hash, coins)) {
mempool.pruneSpent(hash, coins); mempool.pruneSpent(hash, coins);
if (coins.IsAvailable(vOutPoints[i].n)) { if (coins.IsAvailable(vOutPoints[i].n)) {
hits[i] = true; hit = true;
// Safe to index into vout here because IsAvailable checked if it's off the end of the array, or if // Safe to index into vout here because IsAvailable checked if it's off the end of the array, or if
// n is valid but points to an already spent output (IsNull). // n is valid but points to an already spent output (IsNull).
CCoin coin; CCoin coin;
@ -533,10 +534,11 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart)
} }
} }
bitmapStringRepresentation.append(hits[i] ? "1" : "0"); // form a binary string representation (human-readable for json output) hits.push_back(hit);
bitmapStringRepresentation.append(hit ? "1" : "0"); // form a binary string representation (human-readable for json output)
bitmap[i / 8] |= ((uint8_t)hit) << (i % 8);
} }
} }
boost::to_block_range(hits, std::back_inserter(bitmap));
switch (rf) { switch (rf) {
case RF_BINARY: { case RF_BINARY: {