diff --git a/src/Event.cpp b/src/Event.cpp index 28e597e3bd7ddec8d5d4430189767786053a1521..4daba6c755c8b56d8c4da44ac11b802ec6a939c8 100644 --- a/src/Event.cpp +++ b/src/Event.cpp @@ -51,12 +51,8 @@ Event Event::next() const { if(s == 0) return Event(); size_t i = m_impl->m_container->size()+1; if(keys[0].size() <= i) return Event(); - if(keys[0][i] != '%') return Event(); - std::stringstream strEventNumber; - strEventNumber << std::hex << keys[0].substr(i+1); - EventNumber n; - strEventNumber >> n; - + EventNumber n = Impl::parseEventNumberFromKeyString(&keys[0][i]); + if(n == InvalidEventNumber) return Event(); return Event(m_impl->m_datastore, m_impl->m_level, m_impl->m_container, n); } diff --git a/src/Run.cpp b/src/Run.cpp index 9b73c1c98d4e7c81fb1c7d3b117024f6562ca845..9efdf55a0fdd8e26be878b4121733c22ebe2fbdf 100644 --- a/src/Run.cpp +++ b/src/Run.cpp @@ -53,12 +53,8 @@ Run Run::next() const { if(s == 0) return Run(); size_t i = m_impl->m_container->size()+1; if(keys[0].size() <= i) return Run(); - if(keys[0][i] != '%') return Run(); - std::stringstream strRunNumber; - strRunNumber << std::hex << keys[0].substr(i+1); - RunNumber rn; - strRunNumber >> rn; - + RunNumber rn = Impl::parseRunNumberFromKeyString(&keys[0][i]); + if(rn == InvalidRunNumber) return Run(); return Run(m_impl->m_datastore, m_impl->m_level, m_impl->m_container, rn); } diff --git a/src/SubRun.cpp b/src/SubRun.cpp index a3fb4854412de61e500fde065f49d03313a45bb4..5cb378b019468048b3449dff531ab727c690450b 100644 --- a/src/SubRun.cpp +++ b/src/SubRun.cpp @@ -56,12 +56,8 @@ SubRun SubRun::next() const { if(s == 0) return SubRun(); size_t i = m_impl->m_container->size()+1; if(keys[0].size() <= i) return SubRun(); - if(keys[0][i] != '%') return SubRun(); - std::stringstream strSubRunNumber; - strSubRunNumber << std::hex << keys[0].substr(i+1); - SubRunNumber rn; - strSubRunNumber >> rn; - + SubRunNumber rn = Impl::parseSubRunNumberFromKeyString(&keys[0][i]); + if(rn == InvalidSubRunNumber) return SubRun(); return SubRun(m_impl->m_datastore, m_impl->m_level, m_impl->m_container, rn); } diff --git a/src/private/EventImpl.hpp b/src/private/EventImpl.hpp index da837c040ee4bad96561fcf573881632dd1330b4..458d254a2d69bda242da3932efac37e6784b9578 100644 --- a/src/private/EventImpl.hpp +++ b/src/private/EventImpl.hpp @@ -6,6 +6,7 @@ #ifndef __HEPNOS_PRIVATE_EVENT_IMPL_H #define __HEPNOS_PRIVATE_EVENT_IMPL_H +#include #include #include #include @@ -29,9 +30,47 @@ class Event::Impl { , m_event_nr(n) {} static std::string makeKeyStringFromEventNumber(const EventNumber& n) { + std::string str(1+sizeof(n),'\0'); + str[0] = '%'; +#ifndef HEPNOS_READABLE_NUMBERS +#if BOOST_ENDIAN_BIG_BYTE + std::memcpy(&str[1], &n, sizeof(n)); + return str; +#else + unsigned i = sizeof(n); + auto n2 = n; + while(n2 != 0) { + str[i] = n2 & 0xff; + n2 = n2 >> 8; + i -= 1; + } + return str; +#endif +#else std::stringstream strstr; strstr << "%" << std::setfill('0') << std::setw(16) << std::hex << n; return strstr.str(); +#endif + } + + static EventNumber parseEventNumberFromKeyString(const char* str) { + if(str[0] != '%') return InvalidEventNumber; + EventNumber n; +#ifdef HEPNOS_READABLE_NUMBERS + std::stringstream strEventNumber; + strEventNumber << std::hex << std::string(str+1, 16); + strEventNumber >> n; +#else +#if BOOST_ENDIAN_BIG_BYTE + std::memcpy(&n, &str[1], sizeof(n)); +#else + n = 0; + for(unsigned i=0; i < sizeof(n); i++) { + n = 256*n + str[i+1]; + } +#endif +#endif + return n; } std::string makeKeyStringFromEventNumber() const { diff --git a/src/private/RunImpl.hpp b/src/private/RunImpl.hpp index 85acbbe795988d84b36fd35de7a4df8407816f69..87ee061d74ffc957854861e55ab7dc84edfbd2ea 100644 --- a/src/private/RunImpl.hpp +++ b/src/private/RunImpl.hpp @@ -29,10 +29,48 @@ class Run::Impl { , m_container(container) , m_run_nr(rn) {} - static std::string makeKeyStringFromRunNumber(const RunNumber& nr) { + static std::string makeKeyStringFromRunNumber(const RunNumber& n) { + std::string str(1+sizeof(n),'\0'); + str[0] = '%'; +#ifndef HEPNOS_READABLE_NUMBERS +#if BOOST_ENDIAN_BIG_BYTE + std::memcpy(&str[1], &n, sizeof(n)); + return str; +#else + unsigned i = sizeof(n); + auto n2 = n; + while(n2 != 0) { + str[i] = n2 & 0xff; + n2 = n2 >> 8; + i -= 1; + } + return str; +#endif +#else std::stringstream strstr; - strstr << "%" << std::setfill('0') << std::setw(16) << std::hex << nr; + strstr << "%" << std::setfill('0') << std::setw(16) << std::hex << n; return strstr.str(); +#endif + } + + static RunNumber parseRunNumberFromKeyString(const char* str) { + if(str[0] != '%') return InvalidRunNumber; + RunNumber n; +#ifdef HEPNOS_READABLE_NUMBERS + std::stringstream strRunNumber; + strRunNumber << std::hex << std::string(str+1, 16); + strRunNumber >> n; +#else +#if BOOST_ENDIAN_BIG_BYTE + std::memcpy(&n, &str[1], sizeof(n)); +#else + n = 0; + for(unsigned i=0; i < sizeof(n); i++) { + n = 256*n + str[i+1]; + } +#endif +#endif + return n; } std::string makeKeyStringFromRunNumber() const { diff --git a/src/private/SubRunImpl.hpp b/src/private/SubRunImpl.hpp index 75011d986c6f57141441f60836c006ab90cd9f1d..2a6e91882f28bbb60569c1ff2c477dfaf9c1c7ee 100644 --- a/src/private/SubRunImpl.hpp +++ b/src/private/SubRunImpl.hpp @@ -30,9 +30,47 @@ class SubRun::Impl { , m_subrun_nr(rn) {} static std::string makeKeyStringFromSubRunNumber(const SubRunNumber& n) { + std::string str(1+sizeof(n),'\0'); + str[0] = '%'; +#ifndef HEPNOS_READABLE_NUMBERS +#if BOOST_ENDIAN_BIG_BYTE + std::memcpy(&str[1], &n, sizeof(n)); + return str; +#else + unsigned i = sizeof(n); + auto n2 = n; + while(n2 != 0) { + str[i] = n2 & 0xff; + n2 = n2 >> 8; + i -= 1; + } + return str; +#endif +#else std::stringstream strstr; strstr << "%" << std::setfill('0') << std::setw(16) << std::hex << n; return strstr.str(); +#endif + } + + static SubRunNumber parseSubRunNumberFromKeyString(const char* str) { + if(str[0] != '%') return InvalidSubRunNumber; + SubRunNumber n; +#ifdef HEPNOS_READABLE_NUMBERS + std::stringstream strSubRunNumber; + strSubRunNumber << std::hex << std::string(str+1, 16); + strSubRunNumber >> n; +#else +#if BOOST_ENDIAN_BIG_BYTE + std::memcpy(&n, &str[1], sizeof(n)); +#else + n = 0; + for(unsigned i=0; i < sizeof(n); i++) { + n = 256*n + str[i+1]; + } +#endif +#endif + return n; } std::string makeKeyStringFromSubRunNumber() const {