diff --git a/clang/lib/Lex/UnicodeCharSets.h b/clang/lib/Lex/UnicodeCharSets.h index 37ff8af10f68..533f7cb586f8 100644 --- a/clang/lib/Lex/UnicodeCharSets.h +++ b/clang/lib/Lex/UnicodeCharSets.h @@ -9,95 +9,7 @@ #ifndef CLANG_LEX_UNICODECHARSETS_H #define CLANG_LEX_UNICODECHARSETS_H -#include "llvm/ADT/ArrayRef.h" -#include "llvm/ADT/SmallPtrSet.h" -#include "llvm/Support/Compiler.h" -#include "llvm/Support/Debug.h" -#include "llvm/Support/Mutex.h" -#include "llvm/Support/MutexGuard.h" -#include "llvm/Support/raw_ostream.h" - -namespace { - struct UnicodeCharRange { - uint32_t Lower; - uint32_t Upper; - }; - typedef llvm::ArrayRef UnicodeCharSet; - - typedef llvm::SmallPtrSet ValidatedCharSetsTy; -} - -static inline ValidatedCharSetsTy &getValidatedCharSets() { - static ValidatedCharSetsTy Validated; - return Validated; -} - -/// Returns true if each of the ranges in \p CharSet is a proper closed range -/// [min, max], and if the ranges themselves are ordered and non-overlapping. -static inline bool isValidCharSet(UnicodeCharSet CharSet) { -#ifndef NDEBUG - static llvm::sys::Mutex ValidationMutex; - - // Check the validation cache. - { - llvm::MutexGuard Guard(ValidationMutex); - if (getValidatedCharSets().count(CharSet.data())) - return true; - } - - // Walk through the ranges. - uint32_t Prev = 0; - for (UnicodeCharSet::iterator I = CharSet.begin(), E = CharSet.end(); - I != E; ++I) { - if (Prev >= I->Lower) { - DEBUG(llvm::dbgs() << "Upper bound 0x"); - DEBUG(llvm::dbgs().write_hex(Prev)); - DEBUG(llvm::dbgs() << " should be less than succeeding lower bound 0x"); - DEBUG(llvm::dbgs().write_hex(I->Lower) << "\n"); - return false; - } - if (I->Upper < I->Lower) { - DEBUG(llvm::dbgs() << "Upper bound 0x"); - DEBUG(llvm::dbgs().write_hex(I->Lower)); - DEBUG(llvm::dbgs() << " should not be less than lower bound 0x"); - DEBUG(llvm::dbgs().write_hex(I->Upper) << "\n"); - return false; - } - Prev = I->Upper; - } - - // Update the validation cache. - { - llvm::MutexGuard Guard(ValidationMutex); - getValidatedCharSets().insert(CharSet.data()); - } -#endif - return true; -} - -/// Returns true if the Unicode code point \p C is within the set of -/// characters specified by \p CharSet. -LLVM_READONLY static inline bool isCharInSet(uint32_t C, - UnicodeCharSet CharSet) { - assert(isValidCharSet(CharSet)); - - size_t LowPoint = 0; - size_t HighPoint = CharSet.size(); - - // Binary search the set of char ranges. - while (HighPoint != LowPoint) { - size_t MidPoint = (HighPoint + LowPoint) / 2; - if (C < CharSet[MidPoint].Lower) - HighPoint = MidPoint; - else if (C > CharSet[MidPoint].Upper) - LowPoint = MidPoint + 1; - else - return true; - } - - return false; -} - +#include "llvm/Support/UnicodeCharRanges.h" // C11 D.1, C++11 [charname.allowed] static const UnicodeCharRange C11AllowedIDChars[] = {