lib/goog/async/freelist.js

1// Copyright 2015 The Closure Library Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS-IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15/**
16 * @fileoverview Simple freelist.
17 *
18 * An anterative to goog.structs.SimplePool, it imposes the requirement that the
19 * objects in the list contain a "next" property that can be used to maintain
20 * the pool.
21 */
22
23goog.provide('goog.async.FreeList');
24
25
26/**
27 * @template ITEM
28 */
29goog.async.FreeList = goog.defineClass(null, {
30 /**
31 * @param {function():ITEM} create
32 * @param {function(ITEM):void} reset
33 * @param {number} limit
34 */
35 constructor: function(create, reset, limit) {
36 /** @const {number} */
37 this.limit_ = limit;
38 /** @const {function()} */
39 this.create_ = create;
40 /** @const {function(ITEM):void} */
41 this.reset_ = reset;
42
43 /** @type {number} */
44 this.occupants_ = 0;
45 /** @type {ITEM} */
46 this.head_ = null;
47 },
48
49 /**
50 * @return {ITEM}
51 */
52 get: function() {
53 var item;
54 if (this.occupants_ > 0) {
55 this.occupants_--;
56 item = this.head_;
57 this.head_ = item.next;
58 item.next = null;
59 } else {
60 item = this.create_();
61 }
62 return item;
63 },
64
65 /**
66 * @param {ITEM} item An item available for possible future reuse.
67 */
68 put: function(item) {
69 this.reset_(item);
70 if (this.occupants_ < this.limit_) {
71 this.occupants_++;
72 item.next = this.head_;
73 this.head_ = item;
74 }
75 },
76
77 /**
78 * Visible for testing.
79 * @package
80 * @return {number}
81 */
82 occupants: function() {
83 return this.occupants_;
84 }
85});
86
87
88