@@ -85,6 +85,10 @@ manapi::slice_iterator & manapi::slice_iterator::operator++(int) {
8585 return *this ;
8686}
8787
88+ std::string_view manapi::slice_iterator::operator *() {
89+ return std::string_view (static_cast <const char *> (this ->buffer ()), this ->size ());
90+ }
91+
8892bool manapi::slice_iterator::operator ==(const slice_iterator &n) const {
8993 return this ->part == n.part ;
9094}
@@ -120,6 +124,10 @@ manapi::slice_const_iterator & manapi::slice_const_iterator::operator=(const sli
120124
121125manapi::slice_const_iterator::~slice_const_iterator () = default ;
122126
127+ std::string_view manapi::slice_const_iterator::operator *() {
128+ return std::string_view (static_cast <const char *> (this ->buffer ()), this ->size ());
129+ }
130+
123131manapi::slice_const_iterator & manapi::slice_const_iterator::operator ++() {
124132 this ->part = this ->part ->next ;
125133 return *this ;
@@ -430,90 +438,86 @@ manapi::slice_const_iterator manapi::slice_base::end() const {
430438
431439int manapi::slice_base::cmp (const manapi::slice_base &n) const MANAPIHTTP_NOEXCEPT {
432440 auto size = n.size ();
433- if (this ->size () != size)
434- return this ->size () > size ? -1 : 1 ;
435441
436442 auto buffptr1 = this ->first ;
437443 auto buffptr2 = n.first ;
438444
439445 std::size_t cursor1 = this ->shift ();
440446 std::size_t cursor2 = n.shift ();
441447
442- std::size_t size1 = buffptr1->buff .len ;
443- std::size_t size2 = buffptr2->buff .len ;
448+ if (buffptr1 && buffptr2) {
449+ std::size_t size1 = buffptr1->buff .len ;
450+ std::size_t size2 = buffptr2->buff .len ;
444451
445- if (!buffptr1->next )
446- size1 -= this ->rshift_ ;
452+ if (!buffptr1->next )
453+ size1 -= this ->rshift_ ;
447454
448- if (!buffptr2->next )
449- size2 -= n.rshift_ ;
455+ if (!buffptr2->next )
456+ size2 -= n.rshift_ ;
450457
451- while (size) {
452- assert (buffptr1 && buffptr2);
458+ while (size && buffptr1 && buffptr2) {
459+ auto cmp_size = std::min<std::size_t >(size1 - cursor1,
460+ size2 - cursor2);
453461
454- auto const cmp_size = std::min<std:: size_t >(size1 - cursor1,
455- size2 - cursor2) ;
462+ if (cmp_size > size)
463+ cmp_size = size ;
456464
457- if (auto const rhs = strncmp (buffptr1->buff .base + cursor1, buffptr2->buff .base + cursor2, cmp_size))
458- return rhs > 0 ? 1 : -1 ;
465+ if (auto const rhs = memcmp (buffptr1->buff .base + cursor1, buffptr2->buff .base + cursor2, cmp_size))
466+ return rhs > 0 ? 1 : -1 ;
459467
460- cursor1 += cmp_size;
461- cursor2 += cmp_size;
468+ cursor1 += cmp_size;
469+ cursor2 += cmp_size;
462470
463- if (cursor1 == buffptr1->buff .len ) {
464- buffptr1 = buffptr1->next ;
465- cursor1 = 0 ;
471+ if (cursor1 == buffptr1->buff .len ) {
472+ buffptr1 = buffptr1->next ;
473+ cursor1 = 0 ;
466474
467- if (buffptr1) {
468- size1 = buffptr1->buff .len ;
469- if (!buffptr1->next )
470- size1 -= this ->rshift_ ;
475+ if (buffptr1) {
476+ size1 = buffptr1->buff .len ;
477+ if (!buffptr1->next )
478+ size1 -= this ->rshift_ ;
479+ }
471480 }
472- }
473481
474- if (cursor2 == buffptr2->buff .len ) {
475- buffptr2 = buffptr2->next ;
476- cursor2 = 0 ;
482+ if (cursor2 == buffptr2->buff .len ) {
483+ buffptr2 = buffptr2->next ;
484+ cursor2 = 0 ;
477485
478- if (buffptr2) {
479- size2 = buffptr2->buff .len ;
480- if (!buffptr2->next )
481- size2 -= n.rshift_ ;
486+ if (buffptr2) {
487+ size2 = buffptr2->buff .len ;
488+ if (!buffptr2->next )
489+ size2 -= n.rshift_ ;
490+ }
482491 }
483- }
484492
485- assert ( size > = cmp_size) ;
486- size -= cmp_size;
487- };
493+ size - = cmp_size;
494+ }
495+ }
488496
497+ if (this ->size () == size)
498+ return 0 ;
489499
490- return 0 ;
500+ return this -> size () > size ? 1 : - 1 ;
491501}
492502
493503int manapi::slice_base::cmp (void *data, std::size_t size) const MANAPIHTTP_NOEXCEPT {
494- auto const s = this ->size ();
495- if (s == size) {
496- if (!s)
497- return 0 ;
498- int rhs;
499- size_t ss;
500- for (auto it = this ->begin (); it != this ->end (); it++) {
501- assert (size);
502- ss = std::min<std::size_t >(it.size (), size);
503- rhs = memcmp (it.buffer (), data, ss);
504- if (rhs)
505- return rhs;
506- size -= ss;
507- data = static_cast <char *>(data) + ss;
508- }
509- }
510- else {
511- if (s > size)
512- return -1 ;
513- return 1 ;
504+ int rhs;
505+ size_t ss;
506+ for (auto it = this ->begin (); it != this ->end (); it++) {
507+ ss = std::min<std::size_t >(it.size (), size);
508+ rhs = memcmp (static_cast <const char *>(it.buffer ()), static_cast <const char *>(data), ss);
509+ if (rhs)
510+ return rhs;
511+ size -= ss;
512+ data = static_cast <char *>(data) + ss;
513+ if (it.size () != ss)
514+ return 1 ;
514515 }
515516
516- return 0 ;
517+ if (!size)
518+ return 0 ;
519+
520+ return -1 ;
517521}
518522
519523void manapi::slice_base::slices_buffs (ev::buff_t *buffs) const {
0 commit comments