SmallString.h revision 965841cfe4de695fc56cab4821fd7e032ff85b83
1dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner//===- llvm/ADT/SmallString.h - 'Normally small' strings --------*- C++ -*-===//
2dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner//
3dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner//                     The LLVM Compiler Infrastructure
4dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
7dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner//
8dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner//===----------------------------------------------------------------------===//
9dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner//
10dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner// This file defines the SmallString class.
11dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner//
12dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner//===----------------------------------------------------------------------===//
13dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner
14dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner#ifndef LLVM_ADT_SMALLSTRING_H
15dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner#define LLVM_ADT_SMALLSTRING_H
16dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner
17dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner#include "llvm/ADT/SmallVector.h"
1804087d069a17265b964b30e8210262bbdbc4fbecDaniel Dunbar#include "llvm/ADT/StringRef.h"
19dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner
20dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattnernamespace llvm {
21dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner
22dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner/// SmallString - A SmallString is just a SmallVector with methods and accessors
23dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner/// that make it work better as a string (e.g. operator+ etc).
24dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattnertemplate<unsigned InternalLen>
25dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattnerclass SmallString : public SmallVector<char, InternalLen> {
26dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattnerpublic:
27dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner  // Default ctor - Initialize to empty.
28dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner  SmallString() {}
29dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner
30965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer  // Initialize from a StringRef.
31965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer  SmallString(StringRef S) : SmallVector<char, InternalLen>(S.begin(), S.end()) {}
32965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer
33dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner  // Initialize with a range.
34dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner  template<typename ItTy>
35dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner  SmallString(ItTy S, ItTy E) : SmallVector<char, InternalLen>(S, E) {}
363a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
37dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner  // Copy ctor.
38dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner  SmallString(const SmallString &RHS) : SmallVector<char, InternalLen>(RHS) {}
39dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner
403a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
41dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner  // Extra methods.
4204087d069a17265b964b30e8210262bbdbc4fbecDaniel Dunbar  StringRef str() const { return StringRef(this->begin(), this->size()); }
4304087d069a17265b964b30e8210262bbdbc4fbecDaniel Dunbar
4458fe86dc0ecb7efff01abe2b0024a6a53ebb2c81Michael J. Spencer  // TODO: Make this const, if it's safe...
4558fe86dc0ecb7efff01abe2b0024a6a53ebb2c81Michael J. Spencer  const char* c_str() {
4658fe86dc0ecb7efff01abe2b0024a6a53ebb2c81Michael J. Spencer    this->push_back(0);
4758fe86dc0ecb7efff01abe2b0024a6a53ebb2c81Michael J. Spencer    this->pop_back();
4858fe86dc0ecb7efff01abe2b0024a6a53ebb2c81Michael J. Spencer    return this->data();
4958fe86dc0ecb7efff01abe2b0024a6a53ebb2c81Michael J. Spencer  }
5058fe86dc0ecb7efff01abe2b0024a6a53ebb2c81Michael J. Spencer
51983c7fe847dd3f46945f0117ab19345b9c68e88fDaniel Dunbar  // Implicit conversion to StringRef.
52983c7fe847dd3f46945f0117ab19345b9c68e88fDaniel Dunbar  operator StringRef() const { return str(); }
53983c7fe847dd3f46945f0117ab19345b9c68e88fDaniel Dunbar
54dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner  // Extra operators.
5539db3439bfcdca4073dd513879f8ce12ee8c593bDaniel Dunbar  const SmallString &operator=(StringRef RHS) {
560fbdfc3664830e8387c13bf817c44e8b71085142Chris Lattner    this->clear();
570fbdfc3664830e8387c13bf817c44e8b71085142Chris Lattner    return *this += RHS;
580fbdfc3664830e8387c13bf817c44e8b71085142Chris Lattner  }
593a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
6039db3439bfcdca4073dd513879f8ce12ee8c593bDaniel Dunbar  SmallString &operator+=(StringRef RHS) {
6139db3439bfcdca4073dd513879f8ce12ee8c593bDaniel Dunbar    this->append(RHS.begin(), RHS.end());
62dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner    return *this;
63dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner  }
64703f5291c4f7199a95274df5e3381b36f8faf38cChris Lattner  SmallString &operator+=(char C) {
65703f5291c4f7199a95274df5e3381b36f8faf38cChris Lattner    this->push_back(C);
66703f5291c4f7199a95274df5e3381b36f8faf38cChris Lattner    return *this;
67703f5291c4f7199a95274df5e3381b36f8faf38cChris Lattner  }
68dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner};
693a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
70dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner}
71dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner
72dd94c8d6b2afb9c33c364ac8f0c8f8ed5d4c04a0Chris Lattner#endif
73