Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
1// Copyright (c) 2015-present The Bitcoin Core developers2// Distributed under the MIT software license, see the accompanying3// file COPYING or http://www.opensource.org/licenses/mit-license.php.5#include <prevector.h>6#include <serialize.h>7#include <streams.h>8#include <test/util/random.h>9#include <test/util/setup_common.h>11#include <boost/test/unit_test.hpp>13#include <ranges>14#include <vector>16BOOST_FIXTURE_TEST_SUITE(prevector_tests, BasicTestingSetup)18template <unsigned int N, typename T>19class prevector_tester20{21typedef std::vector<T> realtype;22realtype real_vector;23realtype real_vector_alt;25typedef prevector<N, T> pretype;26pretype pre_vector;27pretype pre_vector_alt;29typedef typename pretype::size_type Size;30bool passed = true;31uint256 rand_seed;34template <typename A, typename B>35void local_check_equal(A a, B b)36{37local_check(a == b);38}39void local_check(bool b)40{41passed &= b;42}43void test()44{45const pretype& const_pre_vector = pre_vector;46local_check_equal(real_vector.size(), pre_vector.size());47local_check_equal(real_vector.empty(), pre_vector.empty());48for (Size s = 0; s < real_vector.size(); s++) {49local_check(real_vector[s] == pre_vector[s]);50local_check(&(pre_vector[s]) == &(pre_vector.begin()[s]));51local_check(&(pre_vector[s]) == &*(pre_vector.begin() + s));52local_check(&(pre_vector[s]) == &*((pre_vector.end() + s) - real_vector.size()));53}54// local_check(realtype(pre_vector) == real_vector);55local_check(pretype(real_vector.begin(), real_vector.end()) == pre_vector);56local_check(pretype(pre_vector.begin(), pre_vector.end()) == pre_vector);57size_t pos = 0;58for (const T& v : pre_vector) {59local_check(v == real_vector[pos++]);60}61for (const T& v : pre_vector | std::views::reverse) {62local_check(v == real_vector[--pos]);63}64for (const T& v : const_pre_vector) {65local_check(v == real_vector[pos++]);66}67for (const T& v : const_pre_vector | std::views::reverse) {68local_check(v == real_vector[--pos]);69}70DataStream ss1{};71DataStream ss2{};72ss1 << real_vector;73ss2 << pre_vector;74local_check_equal(ss1.size(), ss2.size());75for (Size s = 0; s < ss1.size(); s++) {76local_check_equal(ss1[s], ss2[s]);77}78}80public:81void resize(Size s)82{83real_vector.resize(s);84local_check_equal(real_vector.size(), s);85pre_vector.resize(s);86local_check_equal(pre_vector.size(), s);87test();88}90void reserve(Size s)91{92real_vector.reserve(s);93local_check(real_vector.capacity() >= s);94pre_vector.reserve(s);95local_check(pre_vector.capacity() >= s);96test();97}99void insert(Size position, const T& value)100{101real_vector.insert(real_vector.begin() + position, value);102pre_vector.insert(pre_vector.begin() + position, value);103test();104}106void insert(Size position, Size count, const T& value)107{108real_vector.insert(real_vector.begin() + position, count, value);109pre_vector.insert(pre_vector.begin() + position, count, value);110test();111}113template <typename I>114void insert_range(Size position, I first, I last)115{116real_vector.insert(real_vector.begin() + position, first, last);117pre_vector.insert(pre_vector.begin() + position, first, last);118test();119}121void erase(Size position)122{123real_vector.erase(real_vector.begin() + position);124pre_vector.erase(pre_vector.begin() + position);125test();126}128void erase(Size first, Size last)129{130real_vector.erase(real_vector.begin() + first, real_vector.begin() + last);131pre_vector.erase(pre_vector.begin() + first, pre_vector.begin() + last);132test();133}135void update(Size pos, const T& value)136{137real_vector[pos] = value;138pre_vector[pos] = value;139test();140}142void push_back(const T& value)143{144real_vector.push_back(value);145pre_vector.push_back(value);146test();147}149void pop_back()150{151real_vector.pop_back();152pre_vector.pop_back();153test();154}156void clear()157{158real_vector.clear();159pre_vector.clear();160}162void assign(Size n, const T& value)163{164real_vector.assign(n, value);165pre_vector.assign(n, value);166}168Size size() const169{170return real_vector.size();171}173Size capacity() const174{175return pre_vector.capacity();176}178void shrink_to_fit()179{180pre_vector.shrink_to_fit();181test();182}184void swap() noexcept185{186real_vector.swap(real_vector_alt);187pre_vector.swap(pre_vector_alt);188test();189}191void move()192{193real_vector = std::move(real_vector_alt);194real_vector_alt.clear();195pre_vector = std::move(pre_vector_alt);196pre_vector_alt.clear();197}199void copy()200{201real_vector = real_vector_alt;202pre_vector = pre_vector_alt;203}205void resize_uninitialized(realtype values)206{207size_t r = values.size();208size_t s = real_vector.size() / 2;209if (real_vector.capacity() < s + r) {210real_vector.reserve(s + r);211}212real_vector.resize(s);213pre_vector.resize_uninitialized(s);214for (auto v : values) {215real_vector.push_back(v);216}217auto p = pre_vector.size();218pre_vector.resize_uninitialized(p + r);219for (auto v : values) {220pre_vector[p] = v;221++p;222}223test();224}226~prevector_tester()227{228BOOST_CHECK_MESSAGE(passed, "insecure_rand: " + rand_seed.ToString());229}231prevector_tester(FastRandomContext& rng)232{233rand_seed = rng.rand256();234rng.Reseed(rand_seed);235}236};238BOOST_AUTO_TEST_CASE(PrevectorTestInt)239{240for (int j = 0; j < 64; j++) {241prevector_tester<8, int> test{m_rng};242for (int i = 0; i < 2048; i++) {243if (m_rng.randbits(2) == 0) {244test.insert(m_rng.randrange(test.size() + 1), int(m_rng.rand32()));245}246if (test.size() > 0 && m_rng.randbits(2) == 1) {247test.erase(m_rng.randrange(test.size()));248}249if (m_rng.randbits(3) == 2) {250int new_size = std::max(0, std::min(30, (int)test.size() + (int)m_rng.randrange(5) - 2));
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.