From 6c347a12c66793db50bb180b3a0ad2ea8c38f6f9 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Mon, 7 Sep 2009 13:39:46 +0200
Subject: [PATCH] Introduced LiteralTable::findLiteral() and
 Control::findIdentifier()

---
 src/shared/cplusplus/Control.cpp    |  3 +++
 src/shared/cplusplus/Control.h      |  2 ++
 src/shared/cplusplus/LiteralTable.h | 16 +++++++++++++++-
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/shared/cplusplus/Control.cpp b/src/shared/cplusplus/Control.cpp
index fce76e32ad8..fda1c3b32b7 100644
--- a/src/shared/cplusplus/Control.cpp
+++ b/src/shared/cplusplus/Control.cpp
@@ -582,6 +582,9 @@ DiagnosticClient *Control::diagnosticClient() const
 void Control::setDiagnosticClient(DiagnosticClient *diagnosticClient)
 { d->diagnosticClient = diagnosticClient; }
 
+Identifier *Control::findIdentifier(const char *chars, unsigned size) const
+{ return d->identifiers.findLiteral(chars, size); }
+
 Identifier *Control::findOrInsertIdentifier(const char *chars, unsigned size)
 { return d->identifiers.findOrInsertLiteral(chars, size); }
 
diff --git a/src/shared/cplusplus/Control.h b/src/shared/cplusplus/Control.h
index 7698e0b226b..beb18aab4fe 100644
--- a/src/shared/cplusplus/Control.h
+++ b/src/shared/cplusplus/Control.h
@@ -166,6 +166,8 @@ public:
     /// Creates a new Objective-C method symbol.
     ObjCMethod *newObjCMethod(unsigned sourceLocation, Name *name = 0);
 
+    Identifier *findIdentifier(const char *chars, unsigned size) const;
+
     Identifier *findOrInsertIdentifier(const char *chars, unsigned size);
     Identifier *findOrInsertIdentifier(const char *chars);
 
diff --git a/src/shared/cplusplus/LiteralTable.h b/src/shared/cplusplus/LiteralTable.h
index 67d074eca63..64fd2e1dac5 100644
--- a/src/shared/cplusplus/LiteralTable.h
+++ b/src/shared/cplusplus/LiteralTable.h
@@ -101,7 +101,21 @@ public:
     iterator end() const
     { return _literals + _literalCount + 1; }
 
-    _Literal *findOrInsertLiteral(const char *chars, unsigned size)
+    _Literal *findLiteral(const char *chars, unsigned size) const
+    {
+       if (_buckets) {
+           unsigned h = _Literal::hashCode(chars, size);
+           _Literal *literal = _buckets[h % _allocatedBuckets];
+           for (; literal; literal = static_cast<_Literal *>(literal->_next)) {
+               if (literal->size() == size && ! std::strncmp(literal->chars(), chars, size))
+                  return literal;
+           }
+       }
+
+       return 0;
+   }
+
+   _Literal *findOrInsertLiteral(const char *chars, unsigned size)
     {
        if (_buckets) {
            unsigned h = _Literal::hashCode(chars, size);
-- 
GitLab