BitfieldMan.cc 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749
  1. /* <!-- copyright */
  2. /*
  3. * aria2 - The high speed download utility
  4. *
  5. * Copyright (C) 2006 Tatsuhiro Tsujikawa
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. *
  21. * In addition, as a special exception, the copyright holders give
  22. * permission to link the code of portions of this program with the
  23. * OpenSSL library under certain conditions as described in each
  24. * individual source file, and distribute linked combinations
  25. * including the two.
  26. * You must obey the GNU General Public License in all respects
  27. * for all of the code used other than OpenSSL. If you modify
  28. * file(s) with this exception, you may extend this exception to your
  29. * version of the file(s), but you are not obligated to do so. If you
  30. * do not wish to do so, delete this exception statement from your
  31. * version. If you delete this exception statement from all source
  32. * files in the program, then also delete it here.
  33. */
  34. /* copyright --> */
  35. #include "BitfieldMan.h"
  36. #include <cassert>
  37. #include <cstring>
  38. #include "array_fun.h"
  39. #include "bitfield.h"
  40. using namespace aria2::expr;
  41. namespace aria2 {
  42. BitfieldMan::BitfieldMan(size_t blockLength, uint64_t totalLength)
  43. :blockLength_(blockLength),
  44. totalLength_(totalLength),
  45. bitfieldLength_(0),
  46. blocks_(0),
  47. filterEnabled_(false),
  48. bitfield_(0),
  49. useBitfield_(0),
  50. filterBitfield_(0),
  51. cachedNumMissingBlock_(0),
  52. cachedNumFilteredBlock_(0),
  53. cachedCompletedLength_(0),
  54. cachedFilteredCompletedLength_(0),
  55. cachedFilteredTotalLength_(0)
  56. {
  57. if(blockLength_ > 0 && totalLength_ > 0) {
  58. blocks_ = totalLength_/blockLength_+(totalLength_%blockLength_ ? 1 : 0);
  59. bitfieldLength_ = blocks_/8+(blocks_%8 ? 1 : 0);
  60. bitfield_ = new unsigned char[bitfieldLength_];
  61. useBitfield_ = new unsigned char[bitfieldLength_];
  62. memset(bitfield_, 0, bitfieldLength_);
  63. memset(useBitfield_, 0, bitfieldLength_);
  64. updateCache();
  65. }
  66. }
  67. BitfieldMan::BitfieldMan(const BitfieldMan& bitfieldMan)
  68. :blockLength_(bitfieldMan.blockLength_),
  69. totalLength_(bitfieldMan.totalLength_),
  70. bitfieldLength_(bitfieldMan.bitfieldLength_),
  71. blocks_(bitfieldMan.blocks_),
  72. filterEnabled_(bitfieldMan.filterEnabled_),
  73. bitfield_(new unsigned char[bitfieldLength_]),
  74. useBitfield_(new unsigned char[bitfieldLength_]),
  75. filterBitfield_(0),
  76. cachedNumMissingBlock_(0),
  77. cachedNumFilteredBlock_(0),
  78. cachedCompletedLength_(0),
  79. cachedFilteredCompletedLength_(0),
  80. cachedFilteredTotalLength_(0)
  81. {
  82. memcpy(bitfield_, bitfieldMan.bitfield_, bitfieldLength_);
  83. memcpy(useBitfield_, bitfieldMan.useBitfield_, bitfieldLength_);
  84. if(filterEnabled_) {
  85. filterBitfield_ = new unsigned char[bitfieldLength_];
  86. memcpy(filterBitfield_, bitfieldMan.filterBitfield_, bitfieldLength_);
  87. }
  88. updateCache();
  89. }
  90. BitfieldMan& BitfieldMan::operator=(const BitfieldMan& bitfieldMan)
  91. {
  92. if(this != &bitfieldMan) {
  93. blockLength_ = bitfieldMan.blockLength_;
  94. totalLength_ = bitfieldMan.totalLength_;
  95. blocks_ = bitfieldMan.blocks_;
  96. bitfieldLength_ = bitfieldMan.bitfieldLength_;
  97. filterEnabled_ = bitfieldMan.filterEnabled_;
  98. delete [] bitfield_;
  99. bitfield_ = new unsigned char[bitfieldLength_];
  100. memcpy(bitfield_, bitfieldMan.bitfield_, bitfieldLength_);
  101. delete [] useBitfield_;
  102. useBitfield_ = new unsigned char[bitfieldLength_];
  103. memcpy(useBitfield_, bitfieldMan.useBitfield_, bitfieldLength_);
  104. delete [] filterBitfield_;
  105. if(filterEnabled_) {
  106. filterBitfield_ = new unsigned char[bitfieldLength_];
  107. memcpy(filterBitfield_, bitfieldMan.filterBitfield_, bitfieldLength_);
  108. } else {
  109. filterBitfield_ = 0;
  110. }
  111. updateCache();
  112. }
  113. return *this;
  114. }
  115. BitfieldMan::~BitfieldMan() {
  116. delete [] bitfield_;
  117. delete [] useBitfield_;
  118. delete [] filterBitfield_;
  119. }
  120. size_t BitfieldMan::getLastBlockLength() const
  121. {
  122. return totalLength_-blockLength_*(blocks_-1);
  123. }
  124. size_t BitfieldMan::getBlockLength(size_t index) const
  125. {
  126. if(index == blocks_-1) {
  127. return getLastBlockLength();
  128. } else if(index < blocks_-1) {
  129. return getBlockLength();
  130. } else {
  131. return 0;
  132. }
  133. }
  134. bool BitfieldMan::hasMissingPiece
  135. (const unsigned char* peerBitfield, size_t length) const
  136. {
  137. if(bitfieldLength_ != length) {
  138. return false;
  139. }
  140. bool retval = false;
  141. for(size_t i = 0; i < bitfieldLength_; ++i) {
  142. unsigned char temp = peerBitfield[i] & ~bitfield_[i];
  143. if(filterEnabled_) {
  144. temp &= filterBitfield_[i];
  145. }
  146. if(temp&0xffu) {
  147. retval = true;
  148. break;
  149. }
  150. }
  151. return retval;
  152. }
  153. bool BitfieldMan::getFirstMissingUnusedIndex(size_t& index) const
  154. {
  155. if(filterEnabled_) {
  156. return bitfield::getFirstMissingIndex
  157. (index, ~array(bitfield_)&~array(useBitfield_)&array(filterBitfield_),
  158. blocks_);
  159. } else {
  160. return bitfield::getFirstMissingIndex
  161. (index, ~array(bitfield_)&~array(useBitfield_), blocks_);
  162. }
  163. }
  164. size_t BitfieldMan::getFirstNMissingUnusedIndex
  165. (std::vector<size_t>& out, size_t n) const
  166. {
  167. if(filterEnabled_) {
  168. return bitfield::getFirstNMissingIndex
  169. (std::back_inserter(out), n,
  170. ~array(bitfield_)&~array(useBitfield_)&array(filterBitfield_), blocks_);
  171. } else {
  172. return bitfield::getFirstNMissingIndex
  173. (std::back_inserter(out), n,
  174. ~array(bitfield_)&~array(useBitfield_), blocks_);
  175. }
  176. }
  177. bool BitfieldMan::getFirstMissingIndex(size_t& index) const
  178. {
  179. if(filterEnabled_) {
  180. return bitfield::getFirstMissingIndex
  181. (index, ~array(bitfield_)&array(filterBitfield_), blocks_);
  182. } else {
  183. return bitfield::getFirstMissingIndex(index, ~array(bitfield_), blocks_);
  184. }
  185. }
  186. namespace {
  187. template<typename Array>
  188. size_t getStartIndex(size_t index, const Array& bitfield, size_t blocks) {
  189. while(index < blocks && bitfield::test(bitfield, blocks, index)) {
  190. ++index;
  191. }
  192. if(blocks <= index) {
  193. return blocks;
  194. } else {
  195. return index;
  196. }
  197. }
  198. } // namespace
  199. namespace {
  200. template<typename Array>
  201. size_t getEndIndex(size_t index, const Array& bitfield, size_t blocks) {
  202. while(index < blocks && !bitfield::test(bitfield, blocks, index)) {
  203. ++index;
  204. }
  205. return index;
  206. }
  207. } // namespace
  208. namespace {
  209. template<typename Array>
  210. bool getSparseMissingUnusedIndex
  211. (size_t& index,
  212. size_t minSplitSize,
  213. const Array& bitfield,
  214. const unsigned char* useBitfield,
  215. size_t blockLength_,
  216. size_t blocks)
  217. {
  218. BitfieldMan::Range maxRange;
  219. BitfieldMan::Range currentRange;
  220. size_t nextIndex = 0;
  221. while(nextIndex < blocks) {
  222. currentRange.startIndex =
  223. getStartIndex(nextIndex, bitfield, blocks);
  224. if(currentRange.startIndex == blocks) {
  225. break;
  226. }
  227. currentRange.endIndex =
  228. getEndIndex(currentRange.startIndex, bitfield, blocks);
  229. if(currentRange.startIndex > 0) {
  230. if(bitfield::test(useBitfield, blocks, currentRange.startIndex-1)) {
  231. currentRange.startIndex = currentRange.getMidIndex();
  232. }
  233. }
  234. // If range is equal, choose a range where its startIndex-1 is
  235. // set.
  236. if(maxRange < currentRange ||
  237. (maxRange == currentRange &&
  238. maxRange.startIndex > 0 && currentRange.startIndex > 0 &&
  239. (!bitfield::test(bitfield, blocks, maxRange.startIndex-1) ||
  240. bitfield::test(useBitfield, blocks, maxRange.startIndex-1))
  241. &&
  242. bitfield::test(bitfield, blocks, currentRange.startIndex-1) &&
  243. !bitfield::test(useBitfield, blocks, currentRange.startIndex-1))) {
  244. maxRange = currentRange;
  245. }
  246. nextIndex = currentRange.endIndex;
  247. }
  248. if(maxRange.getSize()) {
  249. if(maxRange.startIndex == 0) {
  250. index = 0;
  251. return true;
  252. } else {
  253. if((!bitfield::test(useBitfield, blocks, maxRange.startIndex-1) &&
  254. bitfield::test(bitfield, blocks, maxRange.startIndex-1)) ||
  255. ((uint64_t)(maxRange.endIndex-maxRange.startIndex)*blockLength_
  256. >= minSplitSize)) {
  257. index = maxRange.startIndex;
  258. return true;
  259. } else {
  260. return false;
  261. }
  262. }
  263. } else {
  264. return false;
  265. }
  266. }
  267. } // namespace
  268. bool BitfieldMan::getSparseMissingUnusedIndex
  269. (size_t& index,
  270. size_t minSplitSize,
  271. const unsigned char* ignoreBitfield,
  272. size_t ignoreBitfieldLength) const
  273. {
  274. if(filterEnabled_) {
  275. return aria2::getSparseMissingUnusedIndex
  276. (index, minSplitSize,
  277. array(ignoreBitfield)|~array(filterBitfield_)|
  278. array(bitfield_)|array(useBitfield_),
  279. useBitfield_, blockLength_, blocks_);
  280. } else {
  281. return aria2::getSparseMissingUnusedIndex
  282. (index, minSplitSize,
  283. array(ignoreBitfield)|array(bitfield_)|array(useBitfield_),
  284. useBitfield_, blockLength_, blocks_);
  285. }
  286. }
  287. namespace {
  288. template<typename Array>
  289. bool copyBitfield(unsigned char* dst, const Array& src, size_t blocks)
  290. {
  291. unsigned char bits = 0;
  292. size_t len = (blocks+7)/8;
  293. for(size_t i = 0; i < len-1; ++i) {
  294. dst[i] = src[i];
  295. bits |= dst[i];
  296. }
  297. dst[len-1] = src[len-1]&bitfield::lastByteMask(blocks);
  298. bits |= dst[len-1];
  299. return bits != 0;
  300. }
  301. } // namespace
  302. bool BitfieldMan::getAllMissingIndexes(unsigned char* misbitfield, size_t len)
  303. const
  304. {
  305. assert(len == bitfieldLength_);
  306. if(filterEnabled_) {
  307. return copyBitfield
  308. (misbitfield, ~array(bitfield_)&array(filterBitfield_), blocks_);
  309. } else {
  310. return copyBitfield(misbitfield, ~array(bitfield_), blocks_);
  311. }
  312. }
  313. bool BitfieldMan::getAllMissingIndexes(unsigned char* misbitfield, size_t len,
  314. const unsigned char* peerBitfield,
  315. size_t peerBitfieldLength) const
  316. {
  317. assert(len == bitfieldLength_);
  318. if(bitfieldLength_ != peerBitfieldLength) {
  319. return false;
  320. }
  321. if(filterEnabled_) {
  322. return copyBitfield
  323. (misbitfield,
  324. ~array(bitfield_)&array(peerBitfield)&array(filterBitfield_),
  325. blocks_);
  326. } else {
  327. return copyBitfield
  328. (misbitfield, ~array(bitfield_)&array(peerBitfield),
  329. blocks_);
  330. }
  331. }
  332. bool BitfieldMan::getAllMissingUnusedIndexes(unsigned char* misbitfield,
  333. size_t len,
  334. const unsigned char* peerBitfield,
  335. size_t peerBitfieldLength) const
  336. {
  337. assert(len == bitfieldLength_);
  338. if(bitfieldLength_ != peerBitfieldLength) {
  339. return false;
  340. }
  341. if(filterEnabled_) {
  342. return copyBitfield
  343. (misbitfield,
  344. ~array(bitfield_)&~array(useBitfield_)&array(peerBitfield)&
  345. array(filterBitfield_),
  346. blocks_);
  347. } else {
  348. return copyBitfield
  349. (misbitfield,
  350. ~array(bitfield_)&~array(useBitfield_)&array(peerBitfield),
  351. blocks_);
  352. }
  353. }
  354. size_t BitfieldMan::countMissingBlock() const {
  355. return cachedNumMissingBlock_;
  356. }
  357. size_t BitfieldMan::countMissingBlockNow() const {
  358. if(filterEnabled_) {
  359. array_ptr<unsigned char> temp(new unsigned char[bitfieldLength_]);
  360. for(size_t i = 0; i < bitfieldLength_; ++i) {
  361. temp[i] = bitfield_[i]&filterBitfield_[i];
  362. }
  363. size_t count = bitfield::countSetBit(filterBitfield_, blocks_)-
  364. bitfield::countSetBit(temp, blocks_);
  365. return count;
  366. } else {
  367. return blocks_-bitfield::countSetBit(bitfield_, blocks_);
  368. }
  369. }
  370. size_t BitfieldMan::countFilteredBlockNow() const {
  371. if(filterEnabled_) {
  372. return bitfield::countSetBit(filterBitfield_, blocks_);
  373. } else {
  374. return 0;
  375. }
  376. }
  377. bool BitfieldMan::setBitInternal(unsigned char* bitfield, size_t index, bool on) {
  378. if(blocks_ <= index) { return false; }
  379. unsigned char mask = 128 >> (index%8);
  380. if(on) {
  381. bitfield[index/8] |= mask;
  382. } else {
  383. bitfield[index/8] &= ~mask;
  384. }
  385. return true;
  386. }
  387. bool BitfieldMan::setUseBit(size_t index) {
  388. return setBitInternal(useBitfield_, index, true);
  389. }
  390. bool BitfieldMan::unsetUseBit(size_t index) {
  391. return setBitInternal(useBitfield_, index, false);
  392. }
  393. bool BitfieldMan::setBit(size_t index) {
  394. bool b = setBitInternal(bitfield_, index, true);
  395. updateCache();
  396. return b;
  397. }
  398. bool BitfieldMan::unsetBit(size_t index) {
  399. bool b = setBitInternal(bitfield_, index, false);
  400. updateCache();
  401. return b;
  402. }
  403. bool BitfieldMan::isFilteredAllBitSet() const {
  404. if(filterEnabled_) {
  405. for(size_t i = 0; i < bitfieldLength_; ++i) {
  406. if((bitfield_[i]&filterBitfield_[i]) != filterBitfield_[i]) {
  407. return false;
  408. }
  409. }
  410. return true;
  411. } else {
  412. return isAllBitSet();
  413. }
  414. }
  415. namespace {
  416. bool testAllBitSet
  417. (const unsigned char* bitfield, size_t length, size_t blocks)
  418. {
  419. if(length == 0) {
  420. return true;
  421. }
  422. for(size_t i = 0; i < length-1; ++i) {
  423. if(bitfield[i] != 0xffu) {
  424. return false;
  425. }
  426. }
  427. return bitfield[length-1] == bitfield::lastByteMask(blocks);
  428. }
  429. } // namespace
  430. bool BitfieldMan::isAllBitSet() const
  431. {
  432. return testAllBitSet(bitfield_, bitfieldLength_, blocks_);
  433. }
  434. bool BitfieldMan::isAllFilterBitSet() const
  435. {
  436. if(!filterBitfield_) {
  437. return false;
  438. }
  439. return testAllBitSet(filterBitfield_, bitfieldLength_, blocks_);
  440. }
  441. bool BitfieldMan::isBitSet(size_t index) const
  442. {
  443. return bitfield::test(bitfield_, blocks_, index);
  444. }
  445. bool BitfieldMan::isUseBitSet(size_t index) const
  446. {
  447. return bitfield::test(useBitfield_, blocks_, index);
  448. }
  449. void BitfieldMan::setBitfield(const unsigned char* bitfield, size_t bitfieldLength) {
  450. if(bitfieldLength_ != bitfieldLength) {
  451. return;
  452. }
  453. memcpy(bitfield_, bitfield, bitfieldLength_);
  454. memset(useBitfield_, 0, bitfieldLength_);
  455. updateCache();
  456. }
  457. void BitfieldMan::clearAllBit() {
  458. memset(bitfield_, 0, bitfieldLength_);
  459. updateCache();
  460. }
  461. void BitfieldMan::setAllBit() {
  462. for(size_t i = 0; i < blocks_; ++i) {
  463. setBitInternal(bitfield_, i, true);
  464. }
  465. updateCache();
  466. }
  467. void BitfieldMan::clearAllUseBit() {
  468. memset(useBitfield_, 0, bitfieldLength_);
  469. updateCache();
  470. }
  471. void BitfieldMan::setAllUseBit() {
  472. for(size_t i = 0; i < blocks_; ++i) {
  473. setBitInternal(useBitfield_, i, true);
  474. }
  475. }
  476. bool BitfieldMan::setFilterBit(size_t index) {
  477. return setBitInternal(filterBitfield_, index, true);
  478. }
  479. void BitfieldMan::ensureFilterBitfield()
  480. {
  481. if(!filterBitfield_) {
  482. filterBitfield_ = new unsigned char[bitfieldLength_];
  483. memset(filterBitfield_, 0, bitfieldLength_);
  484. }
  485. }
  486. void BitfieldMan::addFilter(uint64_t offset, uint64_t length) {
  487. ensureFilterBitfield();
  488. if(length > 0) {
  489. size_t startBlock = offset/blockLength_;
  490. size_t endBlock = (offset+length-1)/blockLength_;
  491. for(size_t i = startBlock; i <= endBlock && i < blocks_; i++) {
  492. setFilterBit(i);
  493. }
  494. }
  495. updateCache();
  496. }
  497. void BitfieldMan::removeFilter(uint64_t offset, uint64_t length) {
  498. ensureFilterBitfield();
  499. if(length > 0) {
  500. size_t startBlock = offset/blockLength_;
  501. size_t endBlock = (offset+length-1)/blockLength_;
  502. for(size_t i = startBlock; i <= endBlock && i < blocks_; i++) {
  503. setBitInternal(filterBitfield_, i, false);
  504. }
  505. }
  506. updateCache();
  507. }
  508. void BitfieldMan::addNotFilter(uint64_t offset, uint64_t length)
  509. {
  510. ensureFilterBitfield();
  511. if(length > 0 && blocks_ > 0) {
  512. size_t startBlock = offset/blockLength_;
  513. if(blocks_ <= startBlock) {
  514. startBlock = blocks_;
  515. }
  516. size_t endBlock = (offset+length-1)/blockLength_;
  517. for(size_t i = 0; i < startBlock; ++i) {
  518. setFilterBit(i);
  519. }
  520. for(size_t i = endBlock+1; i < blocks_; ++i) {
  521. setFilterBit(i);
  522. }
  523. }
  524. updateCache();
  525. }
  526. void BitfieldMan::enableFilter() {
  527. ensureFilterBitfield();
  528. filterEnabled_ = true;
  529. updateCache();
  530. }
  531. void BitfieldMan::disableFilter() {
  532. filterEnabled_ = false;
  533. updateCache();
  534. }
  535. void BitfieldMan::clearFilter() {
  536. if(filterBitfield_) {
  537. delete [] filterBitfield_;
  538. filterBitfield_ = 0;
  539. }
  540. filterEnabled_ = false;
  541. updateCache();
  542. }
  543. uint64_t BitfieldMan::getFilteredTotalLengthNow() const {
  544. if(!filterBitfield_) {
  545. return 0;
  546. }
  547. size_t filteredBlocks = bitfield::countSetBit(filterBitfield_, blocks_);
  548. if(filteredBlocks == 0) {
  549. return 0;
  550. }
  551. if(bitfield::test(filterBitfield_, blocks_, blocks_-1)) {
  552. return ((uint64_t)filteredBlocks-1)*blockLength_+getLastBlockLength();
  553. } else {
  554. return ((uint64_t)filteredBlocks)*blockLength_;
  555. }
  556. }
  557. uint64_t BitfieldMan::getCompletedLength(bool useFilter) const {
  558. unsigned char* temp;
  559. if(useFilter) {
  560. temp = new unsigned char[bitfieldLength_];
  561. for(size_t i = 0; i < bitfieldLength_; ++i) {
  562. temp[i] = bitfield_[i];
  563. if(filterEnabled_) {
  564. temp[i] &= filterBitfield_[i];
  565. }
  566. }
  567. } else {
  568. temp = bitfield_;
  569. }
  570. size_t completedBlocks = bitfield::countSetBit(temp, blocks_);
  571. uint64_t completedLength = 0;
  572. if(completedBlocks == 0) {
  573. completedLength = 0;
  574. } else {
  575. if(bitfield::test(temp, blocks_, blocks_-1)) {
  576. completedLength = ((uint64_t)completedBlocks-1)*blockLength_+getLastBlockLength();
  577. } else {
  578. completedLength = ((uint64_t)completedBlocks)*blockLength_;
  579. }
  580. }
  581. if(useFilter) {
  582. delete [] temp;
  583. }
  584. return completedLength;
  585. }
  586. uint64_t BitfieldMan::getCompletedLengthNow() const {
  587. return getCompletedLength(false);
  588. }
  589. uint64_t BitfieldMan::getFilteredCompletedLengthNow() const {
  590. return getCompletedLength(true);
  591. }
  592. void BitfieldMan::updateCache()
  593. {
  594. cachedNumMissingBlock_ = countMissingBlockNow();
  595. cachedNumFilteredBlock_ = countFilteredBlockNow();
  596. cachedFilteredTotalLength_ = getFilteredTotalLengthNow();
  597. cachedCompletedLength_ = getCompletedLengthNow();
  598. cachedFilteredCompletedLength_ = getFilteredCompletedLengthNow();
  599. }
  600. bool BitfieldMan::isBitRangeSet(size_t startIndex, size_t endIndex) const
  601. {
  602. for(size_t i = startIndex; i <= endIndex; ++i) {
  603. if(!isBitSet(i)) {
  604. return false;
  605. }
  606. }
  607. return true;
  608. }
  609. void BitfieldMan::unsetBitRange(size_t startIndex, size_t endIndex)
  610. {
  611. for(size_t i = startIndex; i <= endIndex; ++i) {
  612. unsetBit(i);
  613. }
  614. updateCache();
  615. }
  616. void BitfieldMan::setBitRange(size_t startIndex, size_t endIndex)
  617. {
  618. for(size_t i = startIndex; i <= endIndex; ++i) {
  619. setBit(i);
  620. }
  621. updateCache();
  622. }
  623. bool BitfieldMan::isBitSetOffsetRange(uint64_t offset, uint64_t length) const
  624. {
  625. if(length <= 0) {
  626. return false;
  627. }
  628. if(totalLength_ <= offset) {
  629. return false;
  630. }
  631. if(totalLength_ < offset+length) {
  632. length = totalLength_-offset;
  633. }
  634. size_t startBlock = offset/blockLength_;
  635. size_t endBlock = (offset+length-1)/blockLength_;
  636. for(size_t i = startBlock; i <= endBlock; i++) {
  637. if(!isBitSet(i)) {
  638. return false;
  639. }
  640. }
  641. return true;
  642. }
  643. uint64_t BitfieldMan::getMissingUnusedLength(size_t startingIndex) const
  644. {
  645. if(startingIndex < 0 || blocks_ <= startingIndex) {
  646. return 0;
  647. }
  648. uint64_t length = 0;
  649. for(size_t i = startingIndex; i < blocks_; ++i) {
  650. if(isBitSet(i) || isUseBitSet(i)) {
  651. break;
  652. }
  653. length += getBlockLength(i);
  654. }
  655. return length;
  656. }
  657. BitfieldMan::Range::Range(size_t startIndex, size_t endIndex)
  658. :
  659. startIndex(startIndex),
  660. endIndex(endIndex)
  661. {}
  662. size_t BitfieldMan::Range::getSize() const
  663. {
  664. return endIndex-startIndex;
  665. }
  666. size_t BitfieldMan::Range::getMidIndex() const
  667. {
  668. return (endIndex-startIndex)/2+startIndex;
  669. }
  670. bool BitfieldMan::Range::operator<(const Range& range) const
  671. {
  672. return getSize() < range.getSize();
  673. }
  674. bool BitfieldMan::Range::operator==(const Range& range) const
  675. {
  676. return getSize() == range.getSize();
  677. }
  678. } // namespace aria2