LCOV - code coverage report
Current view: top level - src/utils/common - StringTokenizer.cpp (source / functions) Coverage Total Hit
Test: lcov.info Lines: 96.8 % 95 92
Test Date: 2026-01-01 15:49:29 Functions: 100.0 % 15 15

            Line data    Source code
       1              : /****************************************************************************/
       2              : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3              : // Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.
       4              : // This program and the accompanying materials are made available under the
       5              : // terms of the Eclipse Public License 2.0 which is available at
       6              : // https://www.eclipse.org/legal/epl-2.0/
       7              : // This Source Code may also be made available under the following Secondary
       8              : // Licenses when the conditions for such availability set forth in the Eclipse
       9              : // Public License 2.0 are satisfied: GNU General Public License, version 2
      10              : // or later which is available at
      11              : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
      12              : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
      13              : /****************************************************************************/
      14              : /// @file    StringTokenizer.cpp
      15              : /// @author  Daniel Krajzewicz
      16              : /// @author  Jakob Erdmann
      17              : /// @author  Michael Behrisch
      18              : /// @date    ?
      19              : ///
      20              : // A java-style StringTokenizer for c++ (stl)
      21              : /****************************************************************************/
      22              : #include <config.h>
      23              : 
      24              : #include <string>
      25              : #include <vector>
      26              : #include <iostream> // !!! debug only
      27              : 
      28              : #include "UtilExceptions.h"
      29              : #include "StringTokenizer.h"
      30              : 
      31              : 
      32              : // ===========================================================================
      33              : // variable definitions
      34              : // ===========================================================================
      35              : const int StringTokenizer::NEWLINE = -256;
      36              : const int StringTokenizer::WHITECHARS = -257;
      37              : const int StringTokenizer::SPACE = 32;
      38              : const int StringTokenizer::TAB = 9;
      39              : 
      40              : 
      41              : // ===========================================================================
      42              : // method definitions
      43              : // ===========================================================================
      44              : 
      45          119 : StringTokenizer::StringTokenizer() :
      46          119 :     myPos(0) {
      47          119 : }
      48              : 
      49              : 
      50      4837492 : StringTokenizer::StringTokenizer(std::string tosplit) :
      51      4837492 :     myTosplit(tosplit), myPos(0) {
      52      4837492 :     prepareWhitechar(tosplit);
      53      4837492 : }
      54              : 
      55              : 
      56     15712258 : StringTokenizer::StringTokenizer(std::string tosplit, std::string token, bool splitAtAllChars) :
      57     15712258 :     myTosplit(tosplit), myPos(0) {
      58     15712258 :     prepare(tosplit, token, splitAtAllChars);
      59     15712258 : }
      60              : 
      61              : 
      62         2523 : StringTokenizer::StringTokenizer(std::string tosplit, int special) :
      63         2523 :     myTosplit(tosplit), myPos(0) {
      64         2523 :     switch (special) {
      65              :         case NEWLINE:
      66            1 :             prepare(tosplit, "\r\n", true);
      67            1 :             break;
      68              :         case TAB:
      69          679 :             prepare(tosplit, "\t", true);
      70          679 :             break;
      71         1321 :         case WHITECHARS:
      72         1321 :             prepareWhitechar(tosplit);
      73              :             break;
      74          522 :         default:
      75          522 :             char* buf = new char[2];
      76          522 :             buf[0] = (char) special;
      77          522 :             buf[1] = 0;
      78          522 :             prepare(tosplit, buf, false);
      79          522 :             delete[] buf;
      80              :             break;
      81              :     }
      82         2523 : }
      83              : 
      84              : 
      85     20552392 : StringTokenizer::~StringTokenizer() {}
      86              : 
      87              : 
      88      2994906 : void StringTokenizer::reinit() {
      89      2994906 :     myPos = 0;
      90      2994906 : }
      91              : 
      92              : 
      93     33532955 : bool StringTokenizer::hasNext() {
      94     33532955 :     return myPos != (int)myStarts.size();
      95              : }
      96              : 
      97              : 
      98     47098074 : std::string StringTokenizer::next() {
      99     47098074 :     if (myPos >= (int)myStarts.size()) {
     100            8 :         throw OutOfBoundsException();
     101              :     }
     102     47098070 :     if (myLengths[myPos] == 0) {
     103           85 :         myPos++;
     104           85 :         return "";
     105              :     }
     106     47097985 :     int start = myStarts[myPos];
     107     47097985 :     int length = myLengths[myPos++];
     108     47097985 :     return myTosplit.substr(start, length);
     109              : }
     110              : 
     111              : 
     112          941 : std::string StringTokenizer::front() {
     113          941 :     if (myStarts.size() == 0) {
     114            0 :         throw OutOfBoundsException();
     115              :     }
     116          941 :     if (myLengths[0] == 0) {
     117            0 :         return "";
     118              :     }
     119          941 :     return myTosplit.substr(myStarts[0], myLengths[0]);
     120              : }
     121              : 
     122              : 
     123       280125 : std::string StringTokenizer::get(int pos) const {
     124       280125 :     if (pos >= (int)myStarts.size()) {
     125            4 :         throw OutOfBoundsException();
     126              :     }
     127       280123 :     if (myLengths[pos] == 0) {
     128          574 :         return "";
     129              :     }
     130       279549 :     int start = myStarts[pos];
     131              :     int length = myLengths[pos];
     132       279549 :     return myTosplit.substr(start, length);
     133              : }
     134              : 
     135              : 
     136     24891279 : int StringTokenizer::size() const {
     137     24891279 :     return (int)myStarts.size();
     138              : }
     139              : 
     140              : 
     141     15713460 : void StringTokenizer::prepare(const std::string& tosplit, const std::string& token, bool splitAtAllChars) {
     142     15713460 :     int beg = 0;
     143     15713460 :     int len = (int)token.length();
     144     15713460 :     if (splitAtAllChars) {
     145              :         len = 1;
     146              :     }
     147     49913735 :     while (beg < (int)tosplit.length()) {
     148              :         std::string::size_type end;
     149     34200275 :         if (splitAtAllChars) {
     150        14194 :             end = tosplit.find_first_of(token, beg);
     151              :         } else {
     152     34186081 :             end = tosplit.find(token, beg);
     153              :         }
     154     34200275 :         if (end == std::string::npos) {
     155              :             end = tosplit.length();
     156              :         }
     157     34200275 :         myStarts.push_back(beg);
     158     34200275 :         myLengths.push_back((int)end - beg);
     159     34200275 :         beg = (int)end + len;
     160     34200275 :         if (beg == (int)tosplit.length()) {
     161           44 :             myStarts.push_back(beg - 1);
     162           44 :             myLengths.push_back(0);
     163              :         }
     164              :     }
     165     15713460 : }
     166              : 
     167              : 
     168      4838813 : void StringTokenizer::prepareWhitechar(const std::string& tosplit) {
     169              :     std::string::size_type len = tosplit.length();
     170              :     std::string::size_type beg = 0;
     171      4838907 :     while (beg < len && tosplit[beg] <= SPACE) {
     172           94 :         beg++;
     173              :     }
     174     19276082 :     while (beg != std::string::npos && beg < len) {
     175              :         std::string::size_type end = beg;
     176    165309204 :         while (end < len && tosplit[end] > SPACE) {
     177    150871935 :             end++;
     178              :         }
     179     14437269 :         myStarts.push_back((int)beg);
     180     14437269 :         myLengths.push_back((int)end - (int)beg);
     181              :         beg = end;
     182     24754900 :         while (beg < len && tosplit[beg] <= SPACE) {
     183     10317631 :             beg++;
     184              :         }
     185              :     }
     186      4838813 : }
     187              : 
     188              : 
     189              : std::vector<std::string>
     190      2994905 : StringTokenizer::getVector() {
     191              :     std::vector<std::string> ret;
     192      2994905 :     ret.reserve(size());
     193      9867656 :     while (hasNext()) {
     194     13745502 :         ret.push_back(next());
     195              :     }
     196      2994905 :     reinit();
     197      2994905 :     return ret;
     198            0 : }
     199              : 
     200              : 
     201              : std::set<std::string>
     202           29 : StringTokenizer::getSet() {
     203           29 :     std::vector<std::string> v = getVector();
     204           58 :     return std::set<std::string>(v.begin(), v.end());
     205           29 : }
     206              : 
     207              : 
     208              : /****************************************************************************/
        

Generated by: LCOV version 2.0-1