summaryrefslogtreecommitdiffstats
path: root/src/string_piece.h
diff options
context:
space:
mode:
authorEvan Martin <martine@danga.com>2011-09-12 17:17:11 (GMT)
committerEvan Martin <martine@danga.com>2011-09-12 18:46:18 (GMT)
commitf1139aff5deddacd899be064fad9ed5a185e7444 (patch)
tree2d293defa9fd2d257cb25a20d7a66c110fd1f50b /src/string_piece.h
parent0c8e0f761f55e78bdaaad8a92f39a724e81474bf (diff)
downloadNinja-f1139aff5deddacd899be064fad9ed5a185e7444.zip
Ninja-f1139aff5deddacd899be064fad9ed5a185e7444.tar.gz
Ninja-f1139aff5deddacd899be064fad9ed5a185e7444.tar.bz2
use StringPiece for makefile deps
Because of this, MakefileParser now returns pointers into the source makefile string rather than allocating new strings. Despite needing to take the result and stuff it into a new string anyway to canonicalize it, this takes another 50ms or so off the null Chrome build, likely due to the vector used in MakefileParser changing to a type that doesn't use any allocations. (I also experimented with making the vector reserve an initial size but didn't see any performance impact.)
Diffstat (limited to 'src/string_piece.h')
-rw-r--r--src/string_piece.h51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/string_piece.h b/src/string_piece.h
new file mode 100644
index 0000000..0e55afb
--- /dev/null
+++ b/src/string_piece.h
@@ -0,0 +1,51 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef NINJA_STRINGPIECE_H_
+#define NINJA_STRINGPIECE_H_
+
+#include <string>
+
+using namespace std;
+
+#include <string.h>
+
+/// StringPiece represents a slice of a string whose memory is managed
+/// externally. It is useful for reducing the number of std::strings
+/// we need to allocate.
+struct StringPiece {
+ StringPiece() : str_(NULL), len_(0) {}
+
+ /// The constructors intentionally allow for implicit conversions.
+ StringPiece(const string& str) : str_(str.data()), len_(str.size()) {}
+ StringPiece(const char* str) : str_(str), len_(strlen(str)) {}
+
+ bool operator==(const StringPiece& other) const {
+ return len_ == other.len_ && memcmp(str_, other.str_, len_) == 0;
+ }
+ bool operator!=(const StringPiece& other) const {
+ return !(*this == other);
+ }
+
+ /// Convert the slice into a full-fledged std::string, copying the
+ /// data into a new string.
+ string AsString() const {
+ return string(str_, len_);
+ }
+
+ const char* str_;
+ int len_;
+};
+
+#endif // NINJA_BROWSE_H_