CXString.h revision 0c4394c7f63008fbf4d335710b34f71afab362a3
1ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek//===- CXString.h - Routines for manipulating CXStrings -------------------===//
2ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek//
3ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek//                     The LLVM Compiler Infrastructure
4ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek//
5ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek// This file is distributed under the University of Illinois Open Source
6ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek// License. See LICENSE.TXT for details.
7ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek//
8ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek//===----------------------------------------------------------------------===//
9ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek//
10ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek// This file defines routines for manipulating CXStrings.
11ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek//
12ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek//===----------------------------------------------------------------------===//
13ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek
14ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek#ifndef LLVM_CLANG_CXSTRING_H
15ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek#define LLVM_CLANG_CXSTRING_H
16ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek
17ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek#include "clang-c/Index.h"
18686775deca8b8685eb90801495880e3abdd844c2Chris Lattner#include "clang/Basic/LLVM.h"
19a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek#include "llvm/ADT/SmallString.h"
20f59edb96b2d0bfe612b732f19519ab84bb995bd4Chandler Carruth#include "llvm/ADT/StringRef.h"
219c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko#include <vector>
22ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek
23ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremeneknamespace clang {
24ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremeneknamespace cxstring {
259c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko
269c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenkostruct CXStringBuf;
27ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek
28dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko/// \brief Create a CXString object for an empty "" string.
29dc66adb40ee871b4c578ba615f45d82476c7119eDmitri GribenkoCXString createEmpty();
30dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko
31dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko/// \brief Create a CXString object for an NULL string.
3215a2aa0954bcf38411c14cf67c65e336022a7a1bDmitri Gribenko///
3315a2aa0954bcf38411c14cf67c65e336022a7a1bDmitri Gribenko/// A NULL string should be used as an "invalid" value in case of errors.
34dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri GribenkoCXString createNull();
35dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko
360c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko/// \brief Create a CXString object from a nul-terminated C string.  New
370c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko/// CXString may contain a pointer to \p String.
380c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko///
390c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko/// \p String should not be changed by the caller afterwards.
400c4394c7f63008fbf4d335710b34f71afab362a3Dmitri GribenkoCXString createRef(const char *String);
410c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko
420c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko/// \brief Create a CXString object from a nul-terminated C string.  New
430c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko/// CXString will contain a copy of \p String.
440c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko///
450c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko/// \p String can be changed or freed by the caller.
460c4394c7f63008fbf4d335710b34f71afab362a3Dmitri GribenkoCXString createDup(const char *String);
47ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek
48a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek/// \brief Create a CXString object from a StringRef.
49686775deca8b8685eb90801495880e3abdd844c2Chris LattnerCXString createCXString(StringRef String, bool DupString = true);
50a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek
51a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek/// \brief Create a CXString object that is backed by a string buffer.
52a60ed47da13393796d8552b9fdca12abbb3eea42Ted KremenekCXString createCXString(CXStringBuf *buf);
53a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek
549c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko/// \brief A string pool used for fast allocation/deallocation of strings.
559c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenkoclass CXStringPool {
569c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenkopublic:
579c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  ~CXStringPool();
589c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko
599c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  CXStringBuf *getCXStringBuf(CXTranslationUnit TU);
609c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko
619c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenkoprivate:
629c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  std::vector<CXStringBuf *> Pool;
639c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko
649c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  friend struct CXStringBuf;
659c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko};
669c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko
679c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenkostruct CXStringBuf {
689c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  SmallString<128> Data;
699c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  CXTranslationUnit TU;
709c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko
719c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  CXStringBuf(CXTranslationUnit TU) : TU(TU) {}
729c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko
739c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  /// \brief Return this buffer to the pool.
749c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  void dispose();
759c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko};
76a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek
77a60ed47da13393796d8552b9fdca12abbb3eea42Ted KremenekCXStringBuf *getCXStringBuf(CXTranslationUnit TU);
78ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek
79baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek/// \brief Returns true if the CXString data is managed by a pool.
80baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenekbool isManagedByPool(CXString str);
81baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek
82ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek}
83ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek}
84ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek
85ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek#endif
86ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek
87