usb: mass storage class implementation stub, set_configuration request
[quarnos.git] / libs / vector.cpp
blob9e3faa17aa2b61c133ece8fb7414601989b174d8
1 /* Quarn OS
3 * Vector
5 * Copyright (C) 2008-2009 Pawel Dziepak
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23 #ifndef _VECTOR_H_
24 #error This file can not be compiled directly.
25 #endif
27 //#include "libs/string.h"
28 //#include "manes/error.h"
30 template<typename T>
31 vector_element<T>::vector_element() : value((T*)0) {}
33 template<typename T>
34 vector_element<T>::~vector_element() {
35 if (value)
36 delete value;
39 template<typename T>
40 void vector_element<T>::set_value(const T &val) {
41 value = new T(val);
44 template<typename T>
45 T &vector_element<T>::get_value() {
46 if (value)
47 return *value;
48 // manes::error er("vector: element is not present");
49 // er.critical();
50 while(1);
53 /* class vector<T> */
54 void memrcpy(char *a, char *b, int size) __attribute__((weak));
55 void memrcpy(char *a, char *b, int size) {
56 for (int i = size - 1; i >= 0; i--) a[i]=b[i];
59 template<typename T>
60 void vector<T>::insert(const int i, const T &obj) {
61 /* if (size < count + 1) {
62 vector_element<T> **temp = new vector_element<T>*[size * 2];
63 memcpy(temp, table, size * sizeof(vector_element<T>*));
64 delete [] table;
65 table = temp;
68 memrcpy((char*)&(table[i+1]),(char*)&(table[i]), (size-i+1) * sizeof(vector_element<T>*));
69 vector_element<T> *element = new vector_element<T>();
70 element->set_value(obj);
71 table[i] = element;
72 count++;*/
75 template<typename T>
76 void vector<T>::add(const T obj) {
77 vector_element<T> *element = new vector_element<T>();
78 if (size < count + 1) {
79 vector_element<T> **temp = new vector_element<T>*[size * 2];
80 memcpy(temp, table, size * sizeof(vector_element<T>*));
81 delete [] table;
82 table = temp;
83 size *= 2;
85 element->set_value(obj);
86 table[count] = element;
87 count++;
90 template<typename T>
91 void vector<T>::remove(const int i) {
92 vector_element<T> *element = table[i];
93 delete element;
95 memcpy(&(table[i]), &(table[i + 1]), (count - i + 1) * sizeof(vector_element<T>*));
96 count--;
99 template<typename T>
100 int vector<T>::get_count() const {
101 return count;
104 template<typename T>
105 T &vector<T>::operator[](const int index) {
106 return table[index]->get_value();
109 template<typename T>
110 const T &vector<T>::operator[](const int index) const {
111 return table[index]->get_value();
115 template<typename T>
116 vector<T>::vector() : count(0), size(32) {
117 table = new vector_element<T>*[size];
120 template<typename T>
121 vector<T>::~vector() {
122 while (get_count())
123 remove(0);
125 delete [] table;