// FileEvent.cxx #include "FileEvent.h" using hes::EventId; using hes::File; using hes::FileEvent; //********************************************************************** // Private member functions. //********************************************************************** // Set the current event iterator. // All changes to the current event come through here. EventId FileEvent::set_event_iter(EventIdList::const_iterator ievid) { // Do nothing if the new event is the same as the old. if ( ievid == m_ievid ) { return *m_ievid; } // Notify subclasses that event is ending. if ( m_ievid != m_evids.end() ) { end_event(); } // Do not allow a change if we are in the middle of writing an // event. This should not happen: end_event() should finish // writing the event. if ( is_writing() ) { return *m_ievid; } // Notify subclasses that a new event is has begun. m_ievid = ievid; if ( ievid != m_evids.end() ) { begin_event(); } return *m_ievid; } //********************************************************************** // Member functions. //********************************************************************** // Constructor. FileEvent::FileEvent() : m_ievid(m_evids.end()) { } //********************************************************************** // Add an event ID. int FileEvent::add_event_id(EventId evid) { bool atend = m_ievid == m_evids.end(); // Handle the first event. if ( ! m_min_evid.is_valid() ) { assert( ! m_max_evid.is_valid() ); assert( m_evids.size() == 0 ); m_evids.push_back(evid); m_min_evid = evid; m_max_evid = evid; m_ievid = m_evids.end(); return m_evids.size(); } assert( m_max_evid.is_valid() ); assert( m_evids.size() != 0 ); // If this ID is in the current range, check that it is not already // included in the list. if ( evid >= m_min_evid && evid <= m_max_evid ) { for ( EventIdList::const_iterator ievid=m_evids.begin(); ievid!=m_evids.end(); ++ievid ) { if ( evid == *ievid ) { return 0; } } } m_evids.push_back(evid); if ( evid > m_max_evid ) { m_max_evid = evid; } else if ( evid < m_min_evid ) { m_min_evid = evid; } // Reset the current event if we are at the end. if ( atend ) { m_ievid = m_evids.end(); } return m_evids.size(); } //********************************************************************** // Return the number of events. int FileEvent::event_count() const { return m_evids.size(); } //********************************************************************** // Return the min event ID. EventId FileEvent::min_event() const { return m_min_evid; } //********************************************************************** // Return the max event ID. EventId FileEvent::max_event() const { return m_max_evid; } //********************************************************************** // Return the list of event ID's. const File::EventIdList& FileEvent::event_ids() const { return m_evids; } //********************************************************************** // Return the current event ID. EventId FileEvent::event() const { if ( m_ievid == m_evids.end() ) { return EventId(); } return *m_ievid; } //********************************************************************** // Set the current event. EventId FileEvent::set_event(EventId evid) { // Simple strategy for now. EventIdList::const_iterator ievid; for ( ievid=m_evids.begin(); ievid!=m_evids.end(); ++ievid ) { if ( *ievid == evid ) { break; } } return set_event_iter(ievid); } //********************************************************************** // Set the current event to the first event. EventId FileEvent::first_event() { return set_event_iter(m_evids.begin()); } //********************************************************************** // Set the current event to the last event; EventId FileEvent::last_event() { EventIdList::const_iterator ievid = m_evids.end(); --ievid; return set_event_iter(ievid); } //********************************************************************** // Advance to the next event. EventId FileEvent::next_event() { return set_event_iter(++m_ievid); } //**********************************************************************