Go to the documentation of this file.00001 #include "CondFormats/Common/interface/SmallWORMDict.h"
00002 #include <cstring>
00003
00004 namespace cond {
00005
00006 SmallWORMDict::SmallWORMDict(){}
00007 SmallWORMDict::~SmallWORMDict(){}
00008
00009 SmallWORMDict::SmallWORMDict(std::vector<std::string> const & idict) :
00010 m_data(std::accumulate(idict.begin(),idict.end(),0,
00011 boost::bind(std::plus<int>(),_1,boost::bind(&std::string::size,_2)))),
00012 m_index(idict.size(),1) {
00013
00014
00015 m_index[0]=0; std::partial_sum(m_index.begin(),m_index.end(),m_index.begin());
00016 std::sort(m_index.begin(),m_index.end(),
00017 boost::bind(std::less<std::string>(),
00018 boost::bind<const std::string&>(&std::vector<std::string>::operator[],boost::ref(idict),_1),
00019 boost::bind<const std::string&>(&std::vector<std::string>::operator[],boost::ref(idict),_2)
00020 )
00021 );
00022
00023
00024 std::vector<char>::iterator p= m_data.begin();
00025 for (size_t j=0; j<m_index.size(); j++) {
00026 size_t i = m_index[j];
00027 p=std::copy(idict[i].begin(),idict[i].end(),p);
00028 m_index[j]=p-m_data.begin();
00029 }
00030
00031 }
00032
00033
00034 struct LessFrame {
00035 bool operator()(SmallWORMDict::Frame const & rh,SmallWORMDict::Frame const & lh) const {
00036 return std::lexicographical_compare(rh.b,rh.b+rh.l,lh.b,lh.b+lh.l);
00037 }
00038
00039 };
00040
00041 size_t SmallWORMDict::index(std::string const & s) const {
00042 return (*find(s)).ind;
00043 }
00044
00045 size_t SmallWORMDict::index(char const * s) const {
00046 return (*find(s)).ind;
00047 }
00048
00049 SmallWORMDict::const_iterator SmallWORMDict::find(std::string const & s) const {
00050 Frame sp(&s[0], s.size(),0);
00051 return
00052 std::lower_bound(begin(),end(),sp, LessFrame());
00053 }
00054
00055 SmallWORMDict::const_iterator SmallWORMDict::find(char const * s) const {
00056 Frame sp(s, ::strlen(s),0);
00057 return
00058 std::lower_bound(begin(),end(),sp, LessFrame());
00059 }
00060
00061
00062 size_t SmallWORMDict::size() const { return m_index.size(); }
00063
00064
00065
00066 }