1643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/* 2643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Google Inc. All rights reserved. 3643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 4643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Redistribution and use in source and binary forms, with or without 5643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * modification, are permitted provided that the following conditions are 6643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * met: 7643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 8643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * * Redistributions of source code must retain the above copyright 9643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * notice, this list of conditions and the following disclaimer. 10643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * * Redistributions in binary form must reproduce the above 11643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * copyright notice, this list of conditions and the following disclaimer 12643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * in the documentation and/or other materials provided with the 13643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * distribution. 14643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * * Neither the name of Google Inc. nor the names of its 15643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * contributors may be used to endorse or promote products derived from 16643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * this software without specific prior written permission. 17643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 18643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29643ca7872b450ea4efacab6188849e5aac2ba161Steve Block */ 30643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 31643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#ifndef WebVector_h 32643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#define WebVector_h 33643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 34643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebCommon.h" 35643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 36643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <algorithm> 37643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 38643ca7872b450ea4efacab6188849e5aac2ba161Steve Blocknamespace WebKit { 39643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 40643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// A simple vector class. 41643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// 42643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Sample usage: 43643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// 44643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// void Foo(WebVector<int>& result) 45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// { 46643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// WebVector<int> data(10); 47643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// for (size_t i = 0; i < data.size(); ++i) 48643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// data[i] = ... 49643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// result.swap(data); 50643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// } 51643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// 52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// It is also possible to assign from other types of random access 53643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// containers: 54643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// 55643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// void Foo(const std::vector<std::string>& input) 56643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// { 57643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// WebVector<WebCString> cstrings = input; 58643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// ... 59643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// } 60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// 61643ca7872b450ea4efacab6188849e5aac2ba161Steve Blocktemplate <typename T> 62643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockclass WebVector { 63643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockpublic: 64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block typedef T ValueType; 65643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 66643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ~WebVector() 67643ca7872b450ea4efacab6188849e5aac2ba161Steve Block { 68643ca7872b450ea4efacab6188849e5aac2ba161Steve Block destroy(); 69643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 70643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 71643ca7872b450ea4efacab6188849e5aac2ba161Steve Block explicit WebVector(size_t size = 0) 72643ca7872b450ea4efacab6188849e5aac2ba161Steve Block { 73643ca7872b450ea4efacab6188849e5aac2ba161Steve Block initialize(size); 74643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 75643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 76643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebVector(const WebVector<T>& other) 77643ca7872b450ea4efacab6188849e5aac2ba161Steve Block { 78643ca7872b450ea4efacab6188849e5aac2ba161Steve Block initializeFrom(other.m_ptr, other.m_size); 79643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 80643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 81643ca7872b450ea4efacab6188849e5aac2ba161Steve Block template <typename C> 82643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebVector(const C& other) 83643ca7872b450ea4efacab6188849e5aac2ba161Steve Block { 84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block initializeFrom(other.size() ? &other[0] : 0, other.size()); 85643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 86643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 87d0825bca7fe65beaee391d30da42e937db621564Steve Block WebVector& operator=(const WebVector& other) 88d0825bca7fe65beaee391d30da42e937db621564Steve Block { 89d0825bca7fe65beaee391d30da42e937db621564Steve Block if (this != &other) 90d0825bca7fe65beaee391d30da42e937db621564Steve Block assign(other); 91d0825bca7fe65beaee391d30da42e937db621564Steve Block return *this; 92d0825bca7fe65beaee391d30da42e937db621564Steve Block } 93d0825bca7fe65beaee391d30da42e937db621564Steve Block 94643ca7872b450ea4efacab6188849e5aac2ba161Steve Block template <typename C> 95643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebVector<T>& operator=(const C& other) 96643ca7872b450ea4efacab6188849e5aac2ba161Steve Block { 97643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (this != reinterpret_cast<const WebVector<T>*>(&other)) 98643ca7872b450ea4efacab6188849e5aac2ba161Steve Block assign(other); 99643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return *this; 100643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 101643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 102643ca7872b450ea4efacab6188849e5aac2ba161Steve Block template <typename C> 103643ca7872b450ea4efacab6188849e5aac2ba161Steve Block void assign(const C& other) 104643ca7872b450ea4efacab6188849e5aac2ba161Steve Block { 105643ca7872b450ea4efacab6188849e5aac2ba161Steve Block assign(other.size() ? &other[0] : 0, other.size()); 106643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block template <typename U> 109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block void assign(const U* values, size_t size) 110643ca7872b450ea4efacab6188849e5aac2ba161Steve Block { 111643ca7872b450ea4efacab6188849e5aac2ba161Steve Block destroy(); 112643ca7872b450ea4efacab6188849e5aac2ba161Steve Block initializeFrom(values, size); 113643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block size_t size() const { return m_size; } 116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool isEmpty() const { return !m_size; } 117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick T& operator[](size_t i) 1195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 1205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick WEBKIT_ASSERT(i < m_size); 1215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return m_ptr[i]; 1225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 1235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick const T& operator[](size_t i) const 1245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 1255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick WEBKIT_ASSERT(i < m_size); 1265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return m_ptr[i]; 1275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 1282bde8e466a4451c7319e3a072d118917957d6554Steve Block 1292bde8e466a4451c7319e3a072d118917957d6554Steve Block bool contains(const T& value) const 1302bde8e466a4451c7319e3a072d118917957d6554Steve Block { 1312bde8e466a4451c7319e3a072d118917957d6554Steve Block for (size_t i = 0; i < m_size; i++) { 1322bde8e466a4451c7319e3a072d118917957d6554Steve Block if (m_ptr[i] == value) 1332bde8e466a4451c7319e3a072d118917957d6554Steve Block return true; 1342bde8e466a4451c7319e3a072d118917957d6554Steve Block } 1352bde8e466a4451c7319e3a072d118917957d6554Steve Block return false; 1362bde8e466a4451c7319e3a072d118917957d6554Steve Block } 137643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 138643ca7872b450ea4efacab6188849e5aac2ba161Steve Block T* data() { return m_ptr; } 139643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const T* data() const { return m_ptr; } 140643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 141643ca7872b450ea4efacab6188849e5aac2ba161Steve Block void swap(WebVector<T>& other) 142643ca7872b450ea4efacab6188849e5aac2ba161Steve Block { 143643ca7872b450ea4efacab6188849e5aac2ba161Steve Block std::swap(m_ptr, other.m_ptr); 144643ca7872b450ea4efacab6188849e5aac2ba161Steve Block std::swap(m_size, other.m_size); 145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 147643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockprivate: 148643ca7872b450ea4efacab6188849e5aac2ba161Steve Block void initialize(size_t size) 149643ca7872b450ea4efacab6188849e5aac2ba161Steve Block { 150643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_size = size; 151643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!m_size) 152643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_ptr = 0; 153643ca7872b450ea4efacab6188849e5aac2ba161Steve Block else { 154643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_ptr = static_cast<T*>(::operator new(sizeof(T) * m_size)); 155643ca7872b450ea4efacab6188849e5aac2ba161Steve Block for (size_t i = 0; i < m_size; ++i) 156643ca7872b450ea4efacab6188849e5aac2ba161Steve Block new (&m_ptr[i]) T(); 157643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 158643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 159643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 160643ca7872b450ea4efacab6188849e5aac2ba161Steve Block template <typename U> 161643ca7872b450ea4efacab6188849e5aac2ba161Steve Block void initializeFrom(const U* values, size_t size) 162643ca7872b450ea4efacab6188849e5aac2ba161Steve Block { 163643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_size = size; 164643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!m_size) 165643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_ptr = 0; 166643ca7872b450ea4efacab6188849e5aac2ba161Steve Block else { 167643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_ptr = static_cast<T*>(::operator new(sizeof(T) * m_size)); 168643ca7872b450ea4efacab6188849e5aac2ba161Steve Block for (size_t i = 0; i < m_size; ++i) 169643ca7872b450ea4efacab6188849e5aac2ba161Steve Block new (&m_ptr[i]) T(values[i]); 170643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 171643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 172643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 173643ca7872b450ea4efacab6188849e5aac2ba161Steve Block void destroy() 174643ca7872b450ea4efacab6188849e5aac2ba161Steve Block { 175643ca7872b450ea4efacab6188849e5aac2ba161Steve Block for (size_t i = 0; i < m_size; ++i) 176643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_ptr[i].~T(); 177643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ::operator delete(m_ptr); 178643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 179643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 180643ca7872b450ea4efacab6188849e5aac2ba161Steve Block T* m_ptr; 181643ca7872b450ea4efacab6188849e5aac2ba161Steve Block size_t m_size; 182643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}; 183643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1842bde8e466a4451c7319e3a072d118917957d6554Steve Block} // namespace WebKit 185643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 186643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 187