00001 #include "IOVRevIteratorImpl.h" 00002 #include<utility> 00003 cond::IOVRevIteratorImpl::IOVRevIteratorImpl( cond::PoolTransaction& pooldb, 00004 const std::string & token) 00005 : m_pooldb(pooldb),m_token(token), m_count(0), m_isInit(false), m_isOpen(false){ 00006 } 00007 cond::IOVRevIteratorImpl::~IOVRevIteratorImpl(){ 00008 } 00009 00010 void cond::IOVRevIteratorImpl::open() const{ 00011 if (m_isOpen) return; 00012 const_cast<cond::IOVRevIteratorImpl*>(this)->m_iov= 00013 cond::TypedRef<cond::IOV>(m_pooldb, m_token); 00014 const_cast<cond::IOVRevIteratorImpl*>(this)->m_isOpen=true; 00015 } 00016 00017 void cond::IOVRevIteratorImpl::init(){ 00018 open(); 00019 m_isInit=true; 00020 m_pos=m_iov->iov.rbegin(); 00021 m_next=m_pos; m_next++; 00022 m_count = empty() ? 0 : size()-1; 00023 } 00024 00025 00026 bool cond::IOVRevIteratorImpl::rewind() { 00027 init(); 00028 return !empty(); 00029 } 00030 00031 bool cond::IOVRevIteratorImpl::empty() const { 00032 open(); 00033 return m_iov->iov.empty(); 00034 } 00035 size_t cond::IOVRevIteratorImpl::size() const { 00036 open(); 00037 return m_iov->iov.size(); 00038 } 00039 size_t cond::IOVRevIteratorImpl::position() const { 00040 return m_count; 00041 } 00042 00043 00044 bool cond::IOVRevIteratorImpl::atEnd() const { 00045 return m_isInit && m_pos==iov().rend(); 00046 } 00047 00048 bool cond::IOVRevIteratorImpl::next(){ 00049 if(!m_isInit){ 00050 init(); 00051 return !empty(); 00052 } 00053 if (atEnd() ) return false; 00054 m_pos=m_next; 00055 if (atEnd() ) return false; 00056 ++m_next; 00057 --m_count; 00058 return true; 00059 } 00060 00061 std::string 00062 cond::IOVRevIteratorImpl::payloadToken() const{ 00063 if(!m_isInit) return std::string(""); 00064 00065 return atEnd() ? std::string("") : m_pos->second; 00066 00067 } 00068 00069 cond::ValidityInterval 00070 cond::IOVRevIteratorImpl::validity() const{ 00071 cond::Time_t since=0; 00072 cond::Time_t till=0; 00073 if (m_isInit && !atEnd()) { 00074 till = m_pos->first; 00075 since = (m_next!=iov().rend()) ? m_next->first + 1 : m_iov->firstsince; 00076 } 00077 return cond::ValidityInterval(since,till); 00078 }