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: 2025-12-06 15:35:27 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      4815662 : StringTokenizer::StringTokenizer(std::string tosplit) :
      51      4815662 :     myTosplit(tosplit), myPos(0) {
      52      4815662 :     prepareWhitechar(tosplit);
      53      4815662 : }
      54              : 
      55              : 
      56     15477566 : StringTokenizer::StringTokenizer(std::string tosplit, std::string token, bool splitAtAllChars) :
      57     15477566 :     myTosplit(tosplit), myPos(0) {
      58     15477566 :     prepare(tosplit, token, splitAtAllChars);
      59     15477566 : }
      60              : 
      61              : 
      62         2524 : StringTokenizer::StringTokenizer(std::string tosplit, int special) :
      63         2524 :     myTosplit(tosplit), myPos(0) {
      64         2524 :     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          523 :         default:
      75          523 :             char* buf = new char[2];
      76          523 :             buf[0] = (char) special;
      77          523 :             buf[1] = 0;
      78          523 :             prepare(tosplit, buf, false);
      79          523 :             delete[] buf;
      80              :             break;
      81              :     }
      82         2524 : }
      83              : 
      84              : 
      85     20295871 : StringTokenizer::~StringTokenizer() {}
      86              : 
      87              : 
      88      2923883 : void StringTokenizer::reinit() {
      89      2923883 :     myPos = 0;
      90      2923883 : }
      91              : 
      92              : 
      93     33094255 : bool StringTokenizer::hasNext() {
      94     33094255 :     return myPos != (int)myStarts.size();
      95              : }
      96              : 
      97              : 
      98     46481495 : std::string StringTokenizer::next() {
      99     46481495 :     if (myPos >= (int)myStarts.size()) {
     100            8 :         throw OutOfBoundsException();
     101              :     }
     102     46481491 :     if (myLengths[myPos] == 0) {
     103           85 :         myPos++;
     104           85 :         return "";
     105              :     }
     106     46481406 :     int start = myStarts[myPos];
     107     46481406 :     int length = myLengths[myPos++];
     108     46481406 :     return myTosplit.substr(start, length);
     109              : }
     110              : 
     111              : 
     112          944 : std::string StringTokenizer::front() {
     113          944 :     if (myStarts.size() == 0) {
     114            0 :         throw OutOfBoundsException();
     115              :     }
     116          944 :     if (myLengths[0] == 0) {
     117            0 :         return "";
     118              :     }
     119          944 :     return myTosplit.substr(myStarts[0], myLengths[0]);
     120              : }
     121              : 
     122              : 
     123       280110 : std::string StringTokenizer::get(int pos) const {
     124       280110 :     if (pos >= (int)myStarts.size()) {
     125            4 :         throw OutOfBoundsException();
     126              :     }
     127       280108 :     if (myLengths[pos] == 0) {
     128          574 :         return "";
     129              :     }
     130       279534 :     int start = myStarts[pos];
     131              :     int length = myLengths[pos];
     132       279534 :     return myTosplit.substr(start, length);
     133              : }
     134              : 
     135              : 
     136     24537108 : int StringTokenizer::size() const {
     137     24537108 :     return (int)myStarts.size();
     138              : }
     139              : 
     140              : 
     141     15478769 : void StringTokenizer::prepare(const std::string& tosplit, const std::string& token, bool splitAtAllChars) {
     142     15478769 :     int beg = 0;
     143     15478769 :     int len = (int)token.length();
     144     15478769 :     if (splitAtAllChars) {
     145              :         len = 1;
     146              :     }
     147     49198025 :     while (beg < (int)tosplit.length()) {
     148              :         std::string::size_type end;
     149     33719256 :         if (splitAtAllChars) {
     150        14363 :             end = tosplit.find_first_of(token, beg);
     151              :         } else {
     152     33704893 :             end = tosplit.find(token, beg);
     153              :         }
     154     33719256 :         if (end == std::string::npos) {
     155              :             end = tosplit.length();
     156              :         }
     157     33719256 :         myStarts.push_back(beg);
     158     33719256 :         myLengths.push_back((int)end - beg);
     159     33719256 :         beg = (int)end + len;
     160     33719256 :         if (beg == (int)tosplit.length()) {
     161           44 :             myStarts.push_back(beg - 1);
     162           44 :             myLengths.push_back(0);
     163              :         }
     164              :     }
     165     15478769 : }
     166              : 
     167              : 
     168      4816983 : void StringTokenizer::prepareWhitechar(const std::string& tosplit) {
     169              :     std::string::size_type len = tosplit.length();
     170              :     std::string::size_type beg = 0;
     171      4817077 :     while (beg < len && tosplit[beg] <= SPACE) {
     172           94 :         beg++;
     173              :     }
     174     19118678 :     while (beg != std::string::npos && beg < len) {
     175              :         std::string::size_type end = beg;
     176    164689798 :         while (end < len && tosplit[end] > SPACE) {
     177    150388103 :             end++;
     178              :         }
     179     14301695 :         myStarts.push_back((int)beg);
     180     14301695 :         myLengths.push_back((int)end - (int)beg);
     181              :         beg = end;
     182     24505046 :         while (beg < len && tosplit[beg] <= SPACE) {
     183     10203351 :             beg++;
     184              :         }
     185              :     }
     186      4816983 : }
     187              : 
     188              : 
     189              : std::vector<std::string>
     190      2923882 : StringTokenizer::getVector() {
     191              :     std::vector<std::string> ret;
     192      2923882 :     ret.reserve(size());
     193      9663171 :     while (hasNext()) {
     194     13478578 :         ret.push_back(next());
     195              :     }
     196      2923882 :     reinit();
     197      2923882 :     return ret;
     198            0 : }
     199              : 
     200              : 
     201              : std::set<std::string>
     202           26 : StringTokenizer::getSet() {
     203           26 :     std::vector<std::string> v = getVector();
     204           52 :     return std::set<std::string>(v.begin(), v.end());
     205           26 : }
     206              : 
     207              : 
     208              : /****************************************************************************/
        

Generated by: LCOV version 2.0-1