#define __MINMAX_DEFINED // use STL's generic min and max templates
#include "list.h" // include STL-list implementation
#include <iostream.h>
// Since the output loop is often used, we can form a template function
// which does the job.
template <class InputIterator>
void copy_to_cout (InputIterator first, InputIterator last) {
while (first != last) cout << *first++;
cout << endl;
}
// The template class "InputIterator" gets a meaning when you study
// chapter 4.2 in iterators.
void main (void)
{
list<int> bit_seq; // define a list of int
int input = 0; // value read from cin
int count_1 = 0; // counter for number of 1's
cout << "Insert values 0 and 1, another value to stop input..." << endl;
while (cin >> input) {
if (!(input == 0 || input == 1)) break;
bit_seq.push_back (input); // list member function push_back
}
// output loop
cout << "Original bit sequence:" << endl;
copy_to_cout (bit_seq.begin(), bit_seq.end());
// create a new list for bit_stuffing
list<int> bit_stuffed_seq (bit_seq);
// define loop iterators
list<int>::iterator first = bit_stuffed_seq.begin();
list<int>::iterator last = bit_stuffed_seq.end();
// bit stuff loop
while (first != last) {
if (*first == 0)
count_1 = 0; // reset 1's-counter
else if (*first == 1)
count_1++; // increment number of
// consecutive 1's
first++; // go to the next list element
if (count_1 == 5) {
// insert a 0 after the fifth consecutive 1
bit_stuffed_seq.insert (first, 0);
count_1 = 0; // reset counter
}
}
// output loop
cout << "Bit-stuffed bit sequence:" << endl;
copy_to_cout (bit_stuffed_seq.begin(), bit_stuffed_seq.end());
double rel_exp; // relative expansion (in percent)
rel_exp = (double) bit_stuffed_seq.size() / bit_seq.size();
rel_exp = (rel_exp - 1) * 100;
cout.precision (4);
cout << "Relative expansion: " << rel_exp << "%" << endl;
cout << "Absolute expansion: " << (bit_stuffed_seq.size()-bit_seq.size());
cout << " bit" << endl;
// bit unstuff loop
first = bit_stuffed_seq.begin();
last = bit_stuffed_seq.end();
list<int>::iterator erase_it; // used because the erase-iterator
// gets invalid
count_1 = 0;
while (first != last) {
if (*first == 0) count_1 = 0; else count_1++;
if (count_1 == 5) {
erase_it = first;
if (*(++erase_it) != 0) { // error in input bit sequence
cout << "not a valid bit-stuffed sequence!" << endl;
exit(0);
}
bit_stuffed_seq.erase (erase_it); // erase zero
count_1 = 0;
}
++first;
}
cout << "After bit-unstuffing: ";
// check for success (using operator==)
bit_stuffed_seq == bit_seq ? cout << "sequences are equal" : \
cout << "sequences are not equal";
cout << endl;
}
Johannes Weidl (J.Weidl@infosys.tuwien.ac.at) - Apr 16, 1996