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.
251}252}253},254[&] {255// at (maybe out of range) and bit assign256size_t pos = provider.ConsumeIntegralInRange<size_t>(0, cdeq.size() + maxlen);257bool newval = ctx.randbool();258bool throw_deq{false}, throw_bitdeq{false};259bool val_deq{false}, val_bitdeq{false};260try {261auto& ref = deq.at(pos);262val_deq = ref;263ref = newval;264} catch (const std::out_of_range&) {265throw_deq = true;266}267try {268auto ref = bitdeq.at(pos);269val_bitdeq = ref;270ref = newval;271} catch (const std::out_of_range&) {272throw_bitdeq = true;273}274assert(throw_deq == throw_bitdeq);275assert(throw_bitdeq == (pos >= cdeq.size()));276if (!throw_deq) assert(val_deq == val_bitdeq);277},278[&] {279// at (maybe out of range) (const)280size_t pos = provider.ConsumeIntegralInRange<size_t>(0, cdeq.size() + maxlen);281bool throw_deq{false}, throw_bitdeq{false};282bool val_deq{false}, val_bitdeq{false};283try {284auto& ref = cdeq.at(pos);285val_deq = ref;286} catch (const std::out_of_range&) {287throw_deq = true;288}289try {290auto ref = cbitdeq.at(pos);291val_bitdeq = ref;292} catch (const std::out_of_range&) {293throw_bitdeq = true;294}295assert(throw_deq == throw_bitdeq);296assert(throw_bitdeq == (pos >= cdeq.size()));297if (!throw_deq) assert(val_deq == val_bitdeq);298},299[&] {300// operator[]301if (!cdeq.empty()) {302size_t pos = provider.ConsumeIntegralInRange<size_t>(0, cdeq.size() - 1);303assert(deq[pos] == bitdeq[pos]);304if (ctx.randbool()) {305deq[pos] = !deq[pos];306bitdeq[pos].flip();307}308}309},310[&] {311// operator[] const312if (!cdeq.empty()) {313size_t pos = provider.ConsumeIntegralInRange<size_t>(0, cdeq.size() - 1);314assert(deq[pos] == bitdeq[pos]);315}316},317[&] {318// front()319if (!cdeq.empty()) {320auto& ref = deq.front();321auto bitref = bitdeq.front();322assert(ref == bitref);323if (ctx.randbool()) {324ref = !ref;325bitref = !bitref;326}327}328},329[&] {330// front() const331if (!cdeq.empty()) {332auto& ref = cdeq.front();333auto bitref = cbitdeq.front();334assert(ref == bitref);335}336},337[&] {338// back() and swap(bool, ref)339if (!cdeq.empty()) {340auto& ref = deq.back();341auto bitref = bitdeq.back();342assert(ref == bitref);343if (ctx.randbool()) {344ref = !ref;345bitref.flip();346}347}348},349[&] {350// back() const351if (!cdeq.empty()) {352const auto& cdeq = deq;353const auto& cbitdeq = bitdeq;354auto& ref = cdeq.back();355auto bitref = cbitdeq.back();356assert(ref == bitref);357}358},359[&] {360// push_back()361if (cdeq.size() < limitlen) {362bool val = ctx.randbool();363if (cdeq.empty()) {364deq.push_back(val);365bitdeq.push_back(val);366} else {367size_t pos = provider.ConsumeIntegralInRange<size_t>(0, cdeq.size() - 1);368auto& ref = deq[pos];369auto bitref = bitdeq[pos];370assert(ref == bitref);371deq.push_back(val);372bitdeq.push_back(val);373assert(ref == bitref); // references are not invalidated374}375}376},377[&] {378// push_front()379if (cdeq.size() < limitlen) {380bool val = ctx.randbool();381if (cdeq.empty()) {382deq.push_front(val);383bitdeq.push_front(val);384} else {385size_t pos = provider.ConsumeIntegralInRange<size_t>(0, cdeq.size() - 1);386auto& ref = deq[pos];387auto bitref = bitdeq[pos];388assert(ref == bitref);389deq.push_front(val);390bitdeq.push_front(val);391assert(ref == bitref); // references are not invalidated392}393}394},395[&] {396// pop_back()397if (!cdeq.empty()) {398if (cdeq.size() == 1) {399deq.pop_back();400bitdeq.pop_back();401} else {402size_t pos = provider.ConsumeIntegralInRange<size_t>(0, cdeq.size() - 2);403auto& ref = deq[pos];404auto bitref = bitdeq[pos];405assert(ref == bitref);406deq.pop_back();407bitdeq.pop_back();408assert(ref == bitref); // references to other elements are not invalidated409}410}411},412[&] {413// pop_front()414if (!cdeq.empty()) {415if (cdeq.size() == 1) {416deq.pop_front();417bitdeq.pop_front();418} else {419size_t pos = provider.ConsumeIntegralInRange<size_t>(1, cdeq.size() - 1);420auto& ref = deq[pos];421auto bitref = bitdeq[pos];422assert(ref == bitref);423deq.pop_front();424bitdeq.pop_front();425assert(ref == bitref); // references to other elements are not invalidated426}427}428},429[&] {430// erase (in middle, single)431if (!cdeq.empty()) {432size_t before = provider.ConsumeIntegralInRange<size_t>(0, cdeq.size() - 1);433size_t after = cdeq.size() - 1 - before;434auto it = deq.erase(cdeq.begin() + before);435auto bitit = bitdeq.erase(cbitdeq.begin() + before);436assert(it == cdeq.begin() + before && it == cdeq.end() - after);437assert(bitit == cbitdeq.begin() + before && bitit == cbitdeq.end() - after);438}439},440[&] {441// erase (at front, range)442size_t count = provider.ConsumeIntegralInRange<size_t>(0, cdeq.size());443auto it = deq.erase(cdeq.begin(), cdeq.begin() + count);444auto bitit = bitdeq.erase(cbitdeq.begin(), cbitdeq.begin() + count);445assert(it == deq.begin());446assert(bitit == bitdeq.begin());447},448[&] {449// erase (at back, range)450size_t count = provider.ConsumeIntegralInRange<size_t>(0, cdeq.size());451auto it = deq.erase(cdeq.end() - count, cdeq.end());452auto bitit = bitdeq.erase(cbitdeq.end() - count, cbitdeq.end());453assert(it == deq.end());454assert(bitit == bitdeq.end());455},456[&] {457// erase (in middle, range)458size_t count = provider.ConsumeIntegralInRange<size_t>(0, cdeq.size());459size_t before = provider.ConsumeIntegralInRange<size_t>(0, cdeq.size() - count);460size_t after = cdeq.size() - count - before;461auto it = deq.erase(cdeq.begin() + before, cdeq.end() - after);462auto bitit = bitdeq.erase(cbitdeq.begin() + before, cbitdeq.end() - after);463assert(it == cdeq.begin() + before && it == cdeq.end() - after);464assert(bitit == cbitdeq.begin() + before && bitit == cbitdeq.end() - after);465},466[&] {467// insert/emplace (in middle, single)468if (cdeq.size() < limitlen) {469size_t before = provider.ConsumeIntegralInRange<size_t>(0, cdeq.size());470bool val = ctx.randbool();471bool do_emplace = provider.ConsumeBool();472auto it = deq.insert(cdeq.begin() + before, val);473auto bitit = do_emplace ? bitdeq.emplace(cbitdeq.begin() + before, val)474: bitdeq.insert(cbitdeq.begin() + before, val);475assert(it == deq.begin() + before);476assert(bitit == bitdeq.begin() + before);477}478},479[&] {480// insert (at front, begin/end)481if (cdeq.size() < limitlen) {482size_t count = provider.ConsumeIntegralInRange<size_t>(0, maxlen);483auto rand_begin = RANDDATA.begin() + ctx.randbits(RANDDATA_BITS);484auto rand_end = rand_begin + count;485auto it = deq.insert(cdeq.begin(), rand_begin, rand_end);486auto bitit = bitdeq.insert(cbitdeq.begin(), rand_begin, rand_end);487assert(it == cdeq.begin());488assert(bitit == cbitdeq.begin());489}490},491[&] {492// insert (at back, begin/end)493if (cdeq.size() < limitlen) {494size_t count = provider.ConsumeIntegralInRange<size_t>(0, maxlen);495auto rand_begin = RANDDATA.begin() + ctx.randbits(RANDDATA_BITS);496auto rand_end = rand_begin + count;497auto it = deq.insert(cdeq.end(), rand_begin, rand_end);498auto bitit = bitdeq.insert(cbitdeq.end(), rand_begin, rand_end);499assert(it == cdeq.end() - count);500assert(bitit == cbitdeq.end() - count);
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.