CXString.h revision dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2a
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
28dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko/// \brief Create a CXString object for an NULL string.
29dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri GribenkoCXString createNull();
30dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko
31ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek/// \brief Create a CXString object from a C string.
32ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed KremenekCXString createCXString(const char *String, bool DupString = false);
33ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek
34a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek/// \brief Create a CXString object from a StringRef.
35686775deca8b8685eb90801495880e3abdd844c2Chris LattnerCXString createCXString(StringRef String, bool DupString = true);
36a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek
37a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek/// \brief Create a CXString object that is backed by a string buffer.
38a60ed47da13393796d8552b9fdca12abbb3eea42Ted KremenekCXString createCXString(CXStringBuf *buf);
39a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek
409c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko/// \brief A string pool used for fast allocation/deallocation of strings.
419c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenkoclass CXStringPool {
429c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenkopublic:
439c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  ~CXStringPool();
449c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko
459c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  CXStringBuf *getCXStringBuf(CXTranslationUnit TU);
469c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko
479c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenkoprivate:
489c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  std::vector<CXStringBuf *> Pool;
499c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko
509c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  friend struct CXStringBuf;
519c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko};
529c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko
539c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenkostruct CXStringBuf {
549c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  SmallString<128> Data;
559c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  CXTranslationUnit TU;
569c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko
579c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  CXStringBuf(CXTranslationUnit TU) : TU(TU) {}
589c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko
599c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  /// \brief Return this buffer to the pool.
609c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  void dispose();
619c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko};
62a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek
63a60ed47da13393796d8552b9fdca12abbb3eea42Ted KremenekCXStringBuf *getCXStringBuf(CXTranslationUnit TU);
64ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek
65baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek/// \brief Returns true if the CXString data is managed by a pool.
66baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenekbool isManagedByPool(CXString str);
67baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek
68ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek}
69ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek}
70ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek
71ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek#endif
72ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek
73