00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "Sequencer.h"
00032
00033 Sequencer::Sequencer() :
00034 m_seenAny( false ),
00035 m_stragglers( 0 )
00036 {
00037 }
00038
00039 Sequencer::Sequencer( const Sequencer& seq ) :
00040 m_seenAny( seq.m_seenAny ),
00041 m_first( seq.m_first ),
00042 m_through( seq.m_through ),
00043 m_stragglers( seq.m_stragglers )
00044 {
00045 }
00046
00047 Sequencer::~Sequencer()
00048 {
00049 if ( 0 != m_stragglers )
00050 {
00051 delete m_stragglers;
00052 }
00053 }
00054
00055 bool
00056 Sequencer::add( uint32_t s )
00057 {
00058 if ( ! m_seenAny )
00059 {
00060 m_seenAny = true;
00061 m_first = s;
00062 m_through = s;
00063 return true;
00064 }
00065 if ( s < m_first )
00066 {
00067 if ( s == (m_first - 1) )
00068 {
00069 m_first = s;
00070 return true;
00071 }
00072 Sequencer* temp = new Sequencer( *this );
00073 m_first = s;
00074 m_through = s;
00075 m_stragglers = temp;
00076 return true;
00077 }
00078 if ( s <= m_through )
00079 {
00080 return false;
00081 }
00082 if ( s == (m_through + 1) )
00083 {
00084 m_through = s;
00085
00086
00087 if ( 0 != m_stragglers )
00088 {
00089 if ( m_stragglers->m_first == (m_through+1) )
00090 {
00091 m_through = m_stragglers->m_through;
00092 Sequencer* temp = m_stragglers;
00093 m_stragglers = temp->m_stragglers;
00094 temp->m_stragglers = 0;
00095 delete temp;
00096 }
00097 }
00098
00099 return true;
00100 }
00101 if ( 0 == m_stragglers )
00102 {
00103 m_stragglers = new Sequencer();
00104 }
00105 return m_stragglers->add(s);
00106 }