Index: third_party/google_input_tools/third_party/closure_library/closure/goog/debug/logbuffer.js |
diff --git a/third_party/google_input_tools/third_party/closure_library/closure/goog/debug/logbuffer.js b/third_party/google_input_tools/third_party/closure_library/closure/goog/debug/logbuffer.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d2ded20df37184d15a4a78f4f55200a571ab71cc |
--- /dev/null |
+++ b/third_party/google_input_tools/third_party/closure_library/closure/goog/debug/logbuffer.js |
@@ -0,0 +1,148 @@ |
+// Copyright 2010 The Closure Library Authors. 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. |
+ |
+/** |
+ * @fileoverview A buffer for log records. The purpose of this is to improve |
+ * logging performance by re-using old objects when the buffer becomes full and |
+ * to eliminate the need for each app to implement their own log buffer. The |
+ * disadvantage to doing this is that log handlers cannot maintain references to |
+ * log records and expect that they are not overwriten at a later point. |
+ * |
+ * @author agrieve@google.com (Andrew Grieve) |
+ */ |
+ |
+goog.provide('goog.debug.LogBuffer'); |
+ |
+goog.require('goog.asserts'); |
+goog.require('goog.debug.LogRecord'); |
+ |
+ |
+ |
+/** |
+ * Creates the log buffer. |
+ * @constructor |
+ * @final |
+ */ |
+goog.debug.LogBuffer = function() { |
+ goog.asserts.assert(goog.debug.LogBuffer.isBufferingEnabled(), |
+ 'Cannot use goog.debug.LogBuffer without defining ' + |
+ 'goog.debug.LogBuffer.CAPACITY.'); |
+ this.clear(); |
+}; |
+ |
+ |
+/** |
+ * A static method that always returns the same instance of LogBuffer. |
+ * @return {!goog.debug.LogBuffer} The LogBuffer singleton instance. |
+ */ |
+goog.debug.LogBuffer.getInstance = function() { |
+ if (!goog.debug.LogBuffer.instance_) { |
+ // This function is written with the return statement after the assignment |
+ // to avoid the jscompiler StripCode bug described in http://b/2608064. |
+ // After that bug is fixed this can be refactored. |
+ goog.debug.LogBuffer.instance_ = new goog.debug.LogBuffer(); |
+ } |
+ return goog.debug.LogBuffer.instance_; |
+}; |
+ |
+ |
+/** |
+ * @define {number} The number of log records to buffer. 0 means disable |
+ * buffering. |
+ */ |
+goog.define('goog.debug.LogBuffer.CAPACITY', 0); |
+ |
+ |
+/** |
+ * The array to store the records. |
+ * @type {!Array.<!goog.debug.LogRecord|undefined>} |
+ * @private |
+ */ |
+goog.debug.LogBuffer.prototype.buffer_; |
+ |
+ |
+/** |
+ * The index of the most recently added record or -1 if there are no records. |
+ * @type {number} |
+ * @private |
+ */ |
+goog.debug.LogBuffer.prototype.curIndex_; |
+ |
+ |
+/** |
+ * Whether the buffer is at capacity. |
+ * @type {boolean} |
+ * @private |
+ */ |
+goog.debug.LogBuffer.prototype.isFull_; |
+ |
+ |
+/** |
+ * Adds a log record to the buffer, possibly overwriting the oldest record. |
+ * @param {goog.debug.Logger.Level} level One of the level identifiers. |
+ * @param {string} msg The string message. |
+ * @param {string} loggerName The name of the source logger. |
+ * @return {!goog.debug.LogRecord} The log record. |
+ */ |
+goog.debug.LogBuffer.prototype.addRecord = function(level, msg, loggerName) { |
+ var curIndex = (this.curIndex_ + 1) % goog.debug.LogBuffer.CAPACITY; |
+ this.curIndex_ = curIndex; |
+ if (this.isFull_) { |
+ var ret = this.buffer_[curIndex]; |
+ ret.reset(level, msg, loggerName); |
+ return ret; |
+ } |
+ this.isFull_ = curIndex == goog.debug.LogBuffer.CAPACITY - 1; |
+ return this.buffer_[curIndex] = |
+ new goog.debug.LogRecord(level, msg, loggerName); |
+}; |
+ |
+ |
+/** |
+ * @return {boolean} Whether the log buffer is enabled. |
+ */ |
+goog.debug.LogBuffer.isBufferingEnabled = function() { |
+ return goog.debug.LogBuffer.CAPACITY > 0; |
+}; |
+ |
+ |
+/** |
+ * Removes all buffered log records. |
+ */ |
+goog.debug.LogBuffer.prototype.clear = function() { |
+ this.buffer_ = new Array(goog.debug.LogBuffer.CAPACITY); |
+ this.curIndex_ = -1; |
+ this.isFull_ = false; |
+}; |
+ |
+ |
+/** |
+ * Calls the given function for each buffered log record, starting with the |
+ * oldest one. |
+ * @param {function(!goog.debug.LogRecord)} func The function to call. |
+ */ |
+goog.debug.LogBuffer.prototype.forEachRecord = function(func) { |
+ var buffer = this.buffer_; |
+ // Corner case: no records. |
+ if (!buffer[0]) { |
+ return; |
+ } |
+ var curIndex = this.curIndex_; |
+ var i = this.isFull_ ? curIndex : -1; |
+ do { |
+ i = (i + 1) % goog.debug.LogBuffer.CAPACITY; |
+ func(/** @type {!goog.debug.LogRecord} */ (buffer[i])); |
+ } while (i != curIndex); |
+}; |
+ |