/* This testcase is part of GDB, the GNU debugger.

   Copyright 1992-2021 Free Software Foundation, Inc.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#include <string>
#include <iostream>
using namespace std;

template <class T>
class StringTest {
public:
   virtual void runTest();
   void testFunction();
};

template <class T>
void StringTest<T>:: runTest() {
   testFunction ();
}

template <class T>
void StringTest <T>::testFunction() {
   // initialize s with string literal
   cout << "in StringTest" << endl;
   string s("I am a shot string");
   cout << s << endl;

   // insert 'r' to fix "shot"
   s.insert(s.begin()+10,'r' );
   cout << s << endl;

   // concatenate another string
   s += "and now a longer string";
   cout << s << endl;

   // find position where blank needs to be inserted
   string::size_type spos = s.find("and");
   s.insert(spos, " ");
   cout << s << endl;

   // erase the concatenated part
   s.erase(spos);
   cout << s << endl;
}

int main() {
   StringTest<wchar_t> ts;
   ts.runTest();

   return 0;
}

/* output:
I am a shot string
I am a short string
I am a short stringand now a longer string
I am a short string and now a longer string
I am a short string
*/
