annotate algs4-c++/src/Buffer.cpp @ 22:c2cbfdf528f6

1.3.44 Ugh. I would never use this in real life but it seems to be what they want.
author Eris Caffee <discordia@eldalin.com>
date Tue, 23 Jun 2015 11:02:31 -0500
parents
children
rev   line source
discordia@22 1 // Sedgewick and Wayne, Algorithms, 4th ed. problem 1.3.44
discordia@22 2
discordia@22 3 // I would never use this in real life. It's far too inefficient.
discordia@22 4
discordia@22 5 #include "Buffer.hpp"
discordia@22 6
discordia@22 7 Buffer::Buffer( void ) :
discordia@22 8 cursor (0),
discordia@22 9 use_s1 (true)
discordia@22 10 {
discordia@22 11 }
discordia@22 12
discordia@22 13 void Buffer::insert( char c ) {
discordia@22 14 if ( use_s1 ) {
discordia@22 15 size_t i = 0;
discordia@22 16 size_t max = s1.size();
discordia@22 17 while ( i != cursor )
discordia@22 18 s2.push( s1.pop() );
discordia@22 19 s2.push( c );
discordia@22 20 while ( i < max )
discordia@22 21 s2.push( s1.pop() );
discordia@22 22 }
discordia@22 23 else {
discordia@22 24 size_t i = 0;
discordia@22 25 size_t max = s2.size();
discordia@22 26 while ( i != cursor )
discordia@22 27 s1.push( s2.pop() );
discordia@22 28 s1.push( c );
discordia@22 29 while ( i < max )
discordia@22 30 s1.push( s2.pop() );
discordia@22 31 }
discordia@22 32 }
discordia@22 33
discordia@22 34 char Buffer::get( void ) {
discordia@22 35 if ( use_s1 )
discordia@22 36 return s1.find( cursor ); // Need to add overloaded T find( size_t k) to Stack
discordia@22 37 else
discordia@22 38 return s2.find( cursor );
discordia@22 39 }
discordia@22 40
discordia@22 41 char Buffer::delete( void ) {
discordia@22 42 if ( use_s1 ) {
discordia@22 43 size_t i = 0;
discordia@22 44 size_t max = s1.size();
discordia@22 45 while ( i != cursor )
discordia@22 46 s2.push( s1.pop() );
discordia@22 47 ++i;
discordia@22 48 while ( i < max )
discordia@22 49 s2.push( s1.pop() );
discordia@22 50 }
discordia@22 51 else {
discordia@22 52 size_t i = 0;
discordia@22 53 size_t max = s2.size();
discordia@22 54 while ( i != cursor )
discordia@22 55 s1.push( s2.pop() );
discordia@22 56 ++i;
discordia@22 57 while ( i < max )
discordia@22 58 s1.push( s2.pop() );
discordia@22 59 }
discordia@22 60
discordia@22 61 if ( cursor > size() )
discordia@22 62 cursor = size();
discordia@22 63 }
discordia@22 64
discordia@22 65 void Buffer::left( size_t k ) {
discordia@22 66 if ( cursor < k )
discordia@22 67 cursor = 0;
discordia@22 68 else
discordia@22 69 cursor -= k;
discordia@22 70 }
discordia@22 71
discordia@22 72 void Buffer::right( size_t k ) {
discordia@22 73 if ( size() - cursor < k )
discordia@22 74 cursor = size();
discordia@22 75 else
discordia@22 76 cursor += k;
discordia@22 77 }
discordia@22 78
discordia@22 79 size_t Buffer::size( void ) {
discordia@22 80 if ( use_s1 )
discordia@22 81 return s1.size();
discordia@22 82 else
discordia@22 83 return s2.size();
discordia@22 84 }