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