CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch9/src/CondFormats/Common/src/SmallWORMDict.cc

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     // sort (use index)
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     //copy
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 }