Updating trunk VERSION from 2139.0 to 2140.0
[chromium-blink-merge.git] / gpu / command_buffer / common / id_allocator.cc
blob7802e1766beac57ee2b0575b4a510587f761f003
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // This file contains the implementation of IdAllocator.
7 #include "gpu/command_buffer/common/id_allocator.h"
9 #include "base/logging.h"
11 namespace gpu {
13 IdAllocatorInterface::~IdAllocatorInterface() {
16 IdAllocator::IdAllocator() {}
18 IdAllocator::~IdAllocator() {}
20 ResourceId IdAllocator::AllocateID() {
21 ResourceId id;
22 ResourceIdSet::iterator iter = free_ids_.begin();
23 if (iter != free_ids_.end()) {
24 id = *iter;
25 } else {
26 id = LastUsedId() + 1;
27 if (!id) {
28 // We wrapped around to 0.
29 id = FindFirstUnusedId();
32 MarkAsUsed(id);
33 return id;
36 ResourceId IdAllocator::AllocateIDAtOrAbove(ResourceId desired_id) {
37 ResourceId id;
38 ResourceIdSet::iterator iter = free_ids_.lower_bound(desired_id);
39 if (iter != free_ids_.end()) {
40 id = *iter;
41 } else if (LastUsedId() < desired_id) {
42 id = desired_id;
43 } else {
44 id = LastUsedId() + 1;
45 if (!id) {
46 // We wrapped around to 0.
47 id = FindFirstUnusedId();
50 MarkAsUsed(id);
51 return id;
54 bool IdAllocator::MarkAsUsed(ResourceId id) {
55 DCHECK(id);
56 free_ids_.erase(id);
57 std::pair<ResourceIdSet::iterator, bool> result = used_ids_.insert(id);
58 return result.second;
61 void IdAllocator::FreeID(ResourceId id) {
62 if (id) {
63 used_ids_.erase(id);
64 free_ids_.insert(id);
68 bool IdAllocator::InUse(ResourceId id) const {
69 return id == kInvalidResource || used_ids_.find(id) != used_ids_.end();
72 ResourceId IdAllocator::LastUsedId() const {
73 if (used_ids_.empty()) {
74 return 0u;
75 } else {
76 return *used_ids_.rbegin();
80 ResourceId IdAllocator::FindFirstUnusedId() const {
81 ResourceId id = 1;
82 for (ResourceIdSet::const_iterator it = used_ids_.begin();
83 it != used_ids_.end(); ++it) {
84 if ((*it) != id) {
85 return id;
87 ++id;
89 return id;
92 NonReusedIdAllocator::NonReusedIdAllocator() : last_id_(0) {
95 NonReusedIdAllocator::~NonReusedIdAllocator() {
98 ResourceId NonReusedIdAllocator::AllocateID() {
99 return ++last_id_;
102 ResourceId NonReusedIdAllocator::AllocateIDAtOrAbove(ResourceId desired_id) {
103 if (desired_id > last_id_)
104 last_id_ = desired_id;
106 return ++last_id_;
109 bool NonReusedIdAllocator::MarkAsUsed(ResourceId id) {
110 NOTREACHED();
111 return false;
114 void NonReusedIdAllocator::FreeID(ResourceId id) {
117 bool NonReusedIdAllocator::InUse(ResourceId id) const {
118 NOTREACHED();
119 return false;
122 } // namespace gpu