Skip to content
Snippets Groups Projects
Strings.cpp 37.4 KiB
Newer Older
        split_pos.push_back(path_size);
        // allocate target vector to keep folder structure and fill it in
        size_t n_folders = split_pos.size()-1;
        path_components.resize(n_folders);
        std::list<int64_t>::iterator it1 = split_pos.begin();
        std::list<int64_t>::iterator it2 = it1;
        ++it2;

        int64_t ic(0);
        for(; it2!=split_pos.end();++it2){
          std::string folder = working_path.substr(*it1+1,*it2-*it1-1);
          if(folder.empty()||(folder.size()==1&&folder==".")){ // skip self-references and double slashes;
Alex Buts's avatar
Alex Buts committed
            it1=it2;
            continue;
          }
          // reprocess up-references;
          if(folder==".."){
Alex Buts's avatar
Alex Buts committed
            if(folder.size()!=2)throw(std::invalid_argument("path contains wrong path group"));
            ic--;
            if(ic<0)throw(std::invalid_argument("path contains relative references to a folder outside of the seach tree"));
            it1=it2;
            continue;
          }
          path_components[ic]=folder;
          ic++;
          it1=it2;
        n_folders=size_t(ic);
        path_components.resize(n_folders);
        return n_folders;
      }

      /**
       * Function checks if the candidate is the member of the group
       * @param group :: vector of string to check
       * @param candidate :: the string which has to be checked against the group
       * @returns :: number of the candidate in the input vector of strings if the candidate belongs to the group
                     or -1 if it does not.
                     Returns the number of the first maching entry in the group if there are duplicated entries in the group
       */
      int isMember(const std::vector<std::string> &group, const std::string &candidate)
      {
        int num(-1);
        for(size_t i=0;i<group.size();i++){
          if(candidate.compare(group[i])==0){
Alex Buts's avatar
Alex Buts committed
            num = int(i);
            return num;
Alex Buts's avatar
Alex Buts committed
        }
        return num;
      }

      /// \cond TEMPLATE
      template MANTID_KERNEL_DLL int section(std::string&,double&);
      template MANTID_KERNEL_DLL int section(std::string&,float&);
      template MANTID_KERNEL_DLL int section(std::string&,int&);
      template MANTID_KERNEL_DLL int section(std::string&,std::string&);

      template MANTID_KERNEL_DLL int sectPartNum(std::string&,double&);
      template MANTID_KERNEL_DLL int sectPartNum(std::string&,int&);
      template MANTID_KERNEL_DLL int sectionMCNPX(std::string&,double&);

      template MANTID_KERNEL_DLL int convert(const std::string&,double&);
      template MANTID_KERNEL_DLL int convert(const std::string&,float&);
      template MANTID_KERNEL_DLL int convert(const std::string&,std::string&);
      template MANTID_KERNEL_DLL int convert(const std::string&,int&);
      template MANTID_KERNEL_DLL int convert(const std::string&,std::size_t&);
      template MANTID_KERNEL_DLL int convert(const char*,std::string&);
      template MANTID_KERNEL_DLL int convert(const char*,double&);
      template MANTID_KERNEL_DLL int convert(const char*,int&);
      template MANTID_KERNEL_DLL int convert(const char*,std::size_t&);

      template MANTID_KERNEL_DLL std::string toString(const double value);
      template MANTID_KERNEL_DLL std::string toString(const float value);
      template MANTID_KERNEL_DLL std::string toString(const int value);
      template MANTID_KERNEL_DLL std::string toString(const uint16_t value);
      template MANTID_KERNEL_DLL std::string toString(const size_t value); // Matches uint64_t on Linux 64 & Win 64
#if defined(__APPLE__) || ( defined(_WIN32) && !defined(_WIN64)) || (defined(__GNUC__) && !defined(__LP64__)) // Mac or 32-bit compiler
      template MANTID_KERNEL_DLL std::string toString(const uint64_t value);
      template MANTID_KERNEL_DLL std::string toString(const std::string value);
      // this block should generate the vector ones as well
      template MANTID_KERNEL_DLL std::string toString(const std::set<int> &value);
      template MANTID_KERNEL_DLL std::string toString(const std::set<int16_t> &value);
      template MANTID_KERNEL_DLL std::string toString(const std::set<size_t> &value); // Matches uint64_t on Linux 64 & Win 64
#if defined(__APPLE__) || ( defined(_WIN32) && !defined(_WIN64)) || (defined(__GNUC__) && !defined(__LP64__)) // Mac or 32-bit compiler
      template MANTID_KERNEL_DLL std::string toString(const std::set<uint64_t> &value);
      template MANTID_KERNEL_DLL int convPartNum(const std::string&,double&);
      template MANTID_KERNEL_DLL int convPartNum(const std::string&,int&);
      template MANTID_KERNEL_DLL int setValues(const std::string&,const std::vector<int>&,std::vector<double>&);
      template MANTID_KERNEL_DLL int writeFile(const std::string&,const double&,const std::vector<double>&);
      template MANTID_KERNEL_DLL int writeFile(const std::string&,const std::vector<double>&,const std::vector<double>&,const std::vector<double>&);
      template MANTID_KERNEL_DLL int writeFile(const std::string&,const std::vector<double>&,const std::vector<double>&);
      template MANTID_KERNEL_DLL int writeFile(const std::string&,const std::vector<float>&,const std::vector<float>&);
      template MANTID_KERNEL_DLL int writeFile(const std::string&,const std::vector<float>&,const std::vector<float>&,const std::vector<float>&);
      /// \endcond TEMPLATE