Mercurial > Algorithms__Sedgewick
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 } |