Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /* This Source Code Form is subject to the terms of the Mozilla Public
3 : * License, v. 2.0. If a copy of the MPL was not distributed with this
4 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 :
6 : #include "nsResourceSet.h"
7 :
8 0 : nsResourceSet::nsResourceSet(const nsResourceSet& aResourceSet)
9 : : mResources(nullptr),
10 : mCount(0),
11 0 : mCapacity(0)
12 : {
13 0 : ConstIterator last = aResourceSet.Last();
14 0 : for (ConstIterator resource = aResourceSet.First(); resource != last; ++resource)
15 0 : Add(*resource);
16 0 : }
17 :
18 :
19 : nsResourceSet&
20 0 : nsResourceSet::operator=(const nsResourceSet& aResourceSet)
21 : {
22 0 : Clear();
23 0 : ConstIterator last = aResourceSet.Last();
24 0 : for (ConstIterator resource = aResourceSet.First(); resource != last; ++resource)
25 0 : Add(*resource);
26 0 : return *this;
27 : }
28 :
29 0 : nsResourceSet::~nsResourceSet()
30 : {
31 0 : MOZ_COUNT_DTOR(nsResourceSet);
32 0 : Clear();
33 0 : delete[] mResources;
34 0 : }
35 :
36 : nsresult
37 0 : nsResourceSet::Clear()
38 : {
39 0 : while (--mCount >= 0) {
40 0 : NS_RELEASE(mResources[mCount]);
41 : }
42 0 : mCount = 0;
43 0 : return NS_OK;
44 : }
45 :
46 : nsresult
47 0 : nsResourceSet::Add(nsIRDFResource* aResource)
48 : {
49 0 : NS_PRECONDITION(aResource != nullptr, "null ptr");
50 0 : if (! aResource)
51 0 : return NS_ERROR_NULL_POINTER;
52 :
53 0 : if (Contains(aResource))
54 0 : return NS_OK;
55 :
56 0 : if (mCount >= mCapacity) {
57 0 : int32_t capacity = mCapacity + 4;
58 0 : nsIRDFResource** resources = new nsIRDFResource*[capacity];
59 0 : for (int32_t i = mCount - 1; i >= 0; --i)
60 0 : resources[i] = mResources[i];
61 :
62 0 : delete[] mResources;
63 :
64 0 : mResources = resources;
65 0 : mCapacity = capacity;
66 : }
67 :
68 0 : mResources[mCount++] = aResource;
69 0 : NS_ADDREF(aResource);
70 0 : return NS_OK;
71 : }
72 :
73 : void
74 0 : nsResourceSet::Remove(nsIRDFResource* aProperty)
75 : {
76 0 : bool found = false;
77 :
78 0 : nsIRDFResource** res = mResources;
79 0 : nsIRDFResource** limit = mResources + mCount;
80 0 : while (res < limit) {
81 0 : if (found) {
82 0 : *(res - 1) = *res;
83 : }
84 0 : else if (*res == aProperty) {
85 0 : NS_RELEASE(*res);
86 0 : found = true;
87 : }
88 0 : ++res;
89 : }
90 :
91 0 : if (found)
92 0 : --mCount;
93 0 : }
94 :
95 : bool
96 0 : nsResourceSet::Contains(nsIRDFResource* aResource) const
97 : {
98 0 : for (int32_t i = mCount - 1; i >= 0; --i) {
99 0 : if (mResources[i] == aResource)
100 0 : return true;
101 : }
102 :
103 0 : return false;
104 : }
105 :
|