source: NonGTP/FCollada/FMath/FMArray.h @ 964

Revision 964, 4.2 KB checked in by igarcia, 18 years ago (diff)
Line 
1/*
2        Copyright (C) 2005-2006 Feeling Software Inc.
3        MIT License: http://www.opensource.org/licenses/mit-license.php
4*/
5
6/**
7        @file FMArray.h
8        The file contains the vector class, which improves on the standard C++ vector class.
9 */
10
11/**
12        A dynamically-sized array.
13        Built on top of the standard C++ vector class, this class improves on the interface
14        by adding useful extra functionality, such as constructor that takes in a constant-sized array,
15        comparison which a constant-sized array, erase and find functions that take in a value, etc.
16
17        @ingroup FMath
18*/
19
20#ifndef _FM_ARRAY_H_
21#define _FM_ARRAY_H_
22
23template <class T>
24class FCOLLADA_EXPORT vector : public std::vector<T>
25{
26public:
27        /** Default constructor. */
28        vector() : std::vector<T>() {}
29
30        /** Constructor: Builds a dynamically-sized array of the wanted size.
31                @param size The wanted size of the array. */
32        vector(size_t size) : std::vector<T>(size) {}
33
34        /** Constructor: Builds a dynamically-sized array of the wanted size.
35                @param size The wanted size of the array
36                @param defaultValue The default value to use for all the entries of the array. */
37        vector(size_t size, const T& defaultValue) : std::vector<T>(size, defaultValue) {}
38
39        /** Copy constructor.
40                @param copy The dynamically-sized array to copy the values from. */
41        vector(const std::vector& copy) : std::vector<T>(copy) {}
42
43        /** Constructor: Builds a dynamically-sized array from a constant-sized array.
44                @param values A constant-sized array of floating-point values.
45                @param count The size of the constant-sized array. */
46        vector(const T* values, size_t count) : std::vector<T>()
47        {
48                resize(count);
49                memcpy(&at(0), values, count * sizeof(T));
50        }
51
52        /** Retrieves an iterator for a given element.
53                @param value The value, contained within the list, to search for.
54                @return An iterator to this element. The end() iterator
55                        is returned if the value is not found. */
56        template <typename _T>
57        inline iterator find(const _T& value) { return std::find(begin(), end(), value); }
58        template <typename _T>
59        inline const_iterator find(const _T& value) const { return std::find(begin(), end(), value); } /**< See above. */
60
61        /** Removes the value at the given position within the list.
62                @param it The list position for the value to remove. */
63        inline void erase(iterator it) { std::vector<T>::erase(it); }
64
65        /** Removes the value at the given position within the list.
66                @param it The list position for the value to remove. */
67        inline void erase(iterator first, iterator last) { std::vector<T>::erase(first, last); }
68
69        /** Removes a value contained within the list, once.
70                @param value The value, contained within the list, to erase from it.
71                @return Whether the value was found and erased from the list. */
72        inline bool erase(const T& value) { iterator it = find(value); if (it != end()) { erase(it); return true; } return false; }
73
74        /** Removes an indexed value contained within the list.
75                @param index The index of the value to erase. */
76        inline void erase(size_t index) { erase(begin() + index); }
77
78        /** Releases a value contained within a list.
79                Use this function only if your vector contains pointers
80                and you are certain that there is no duplicate pointers within the list.
81                @param value The value, contained within the list, to release.
82                @return Whether the value was found and released. */
83        inline bool release(const T& value) { iterator it = find(value); if (it != end()) { erase(it); delete value; return true; } return false; }
84
85        /** Retrieves whether the list contains a given value.
86                @return Whether the list contains a given value. */
87        inline bool contains(const T& value) const { const_iterator it = find(value); return it != end(); }
88};
89
90/** Returns whether a dynamically-sized array is equivalent to a constant-sized array.
91        @param dl A dynamically-sized array.
92        @param cl A constant-sized array.
93        @param count The size of the constant-sized array.
94        @return Whether the two arrays are equivalent. */
95template <typename T>
96inline bool IsEquivalent(const vector<T>& dl, const T* cl, size_t count)
97{
98        if (dl.size() != count) return false;
99        bool equivalent = true;
100        for (size_t i = 0; i < count && equivalent; ++i) equivalent = IsEquivalent(dl.at(i), cl[i]);
101        return equivalent;
102}
103
104#endif // _FM_ARRAY_H_
Note: See TracBrowser for help on using the repository browser.