1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "mozilla/Attributes.h"
9 #include "nsEnumeratorUtils.h"
11 #include "nsISimpleEnumerator.h"
12 #include "nsIStringEnumerator.h"
16 class EmptyEnumeratorImpl
17 : public nsISimpleEnumerator
18 , public nsIUTF8StringEnumerator
19 , public nsIStringEnumerator
22 EmptyEnumeratorImpl() {}
24 // nsISupports interface
25 NS_DECL_ISUPPORTS_INHERITED
// not really inherited, but no mRefCnt
27 // nsISimpleEnumerator
28 NS_DECL_NSISIMPLEENUMERATOR
29 NS_DECL_NSIUTF8STRINGENUMERATOR
30 // can't use NS_DECL_NSISTRINGENUMERATOR because they share the
31 // HasMore() signature
32 NS_IMETHOD
GetNext(nsAString
& aResult
);
34 static EmptyEnumeratorImpl
* GetInstance()
36 static const EmptyEnumeratorImpl kInstance
;
37 return const_cast<EmptyEnumeratorImpl
*>(&kInstance
);
41 // nsISupports interface
42 NS_IMETHODIMP_(MozExternalRefCountType
)
43 EmptyEnumeratorImpl::AddRef(void)
48 NS_IMETHODIMP_(MozExternalRefCountType
)
49 EmptyEnumeratorImpl::Release(void)
54 NS_IMPL_QUERY_INTERFACE(EmptyEnumeratorImpl
, nsISimpleEnumerator
,
55 nsIUTF8StringEnumerator
, nsIStringEnumerator
)
57 // nsISimpleEnumerator interface
59 EmptyEnumeratorImpl::HasMoreElements(bool* aResult
)
66 EmptyEnumeratorImpl::HasMore(bool* aResult
)
73 EmptyEnumeratorImpl::GetNext(nsISupports
** aResult
)
75 return NS_ERROR_UNEXPECTED
;
79 EmptyEnumeratorImpl::GetNext(nsACString
& aResult
)
81 return NS_ERROR_UNEXPECTED
;
85 EmptyEnumeratorImpl::GetNext(nsAString
& aResult
)
87 return NS_ERROR_UNEXPECTED
;
91 NS_NewEmptyEnumerator(nsISimpleEnumerator
** aResult
)
93 *aResult
= EmptyEnumeratorImpl::GetInstance();
97 ////////////////////////////////////////////////////////////////////////////////
99 class nsSingletonEnumerator MOZ_FINAL
: public nsISimpleEnumerator
104 // nsISimpleEnumerator methods
105 NS_IMETHOD
HasMoreElements(bool* aResult
);
106 NS_IMETHOD
GetNext(nsISupports
** aResult
);
108 explicit nsSingletonEnumerator(nsISupports
* aValue
);
111 ~nsSingletonEnumerator();
118 nsSingletonEnumerator::nsSingletonEnumerator(nsISupports
* aValue
)
121 NS_IF_ADDREF(mValue
);
122 mConsumed
= (mValue
? false : true);
125 nsSingletonEnumerator::~nsSingletonEnumerator()
127 NS_IF_RELEASE(mValue
);
130 NS_IMPL_ISUPPORTS(nsSingletonEnumerator
, nsISimpleEnumerator
)
133 nsSingletonEnumerator::HasMoreElements(bool* aResult
)
135 NS_PRECONDITION(aResult
!= 0, "null ptr");
137 return NS_ERROR_NULL_POINTER
;
140 *aResult
= !mConsumed
;
146 nsSingletonEnumerator::GetNext(nsISupports
** aResult
)
148 NS_PRECONDITION(aResult
!= 0, "null ptr");
150 return NS_ERROR_NULL_POINTER
;
154 return NS_ERROR_UNEXPECTED
;
165 NS_NewSingletonEnumerator(nsISimpleEnumerator
** aResult
,
166 nsISupports
* aSingleton
)
168 nsSingletonEnumerator
* enumer
= new nsSingletonEnumerator(aSingleton
);
170 return NS_ERROR_OUT_OF_MEMORY
;
177 ////////////////////////////////////////////////////////////////////////////////
179 class nsUnionEnumerator MOZ_FINAL
: public nsISimpleEnumerator
184 // nsISimpleEnumerator methods
185 NS_IMETHOD
HasMoreElements(bool* aResult
);
186 NS_IMETHOD
GetNext(nsISupports
** aResult
);
188 nsUnionEnumerator(nsISimpleEnumerator
* aFirstEnumerator
,
189 nsISimpleEnumerator
* aSecondEnumerator
);
192 ~nsUnionEnumerator();
195 nsCOMPtr
<nsISimpleEnumerator
> mFirstEnumerator
, mSecondEnumerator
;
200 nsUnionEnumerator::nsUnionEnumerator(nsISimpleEnumerator
* aFirstEnumerator
,
201 nsISimpleEnumerator
* aSecondEnumerator
)
202 : mFirstEnumerator(aFirstEnumerator
)
203 , mSecondEnumerator(aSecondEnumerator
)
209 nsUnionEnumerator::~nsUnionEnumerator()
213 NS_IMPL_ISUPPORTS(nsUnionEnumerator
, nsISimpleEnumerator
)
216 nsUnionEnumerator::HasMoreElements(bool* aResult
)
218 NS_PRECONDITION(aResult
!= 0, "null ptr");
220 return NS_ERROR_NULL_POINTER
;
231 rv
= mFirstEnumerator
->HasMoreElements(aResult
);
243 rv
= mSecondEnumerator
->HasMoreElements(aResult
);
258 nsUnionEnumerator::GetNext(nsISupports
** aResult
)
260 NS_PRECONDITION(aResult
!= 0, "null ptr");
262 return NS_ERROR_NULL_POINTER
;
266 return NS_ERROR_UNEXPECTED
;
270 return mFirstEnumerator
->GetNext(aResult
);
273 return mSecondEnumerator
->GetNext(aResult
);
277 NS_NewUnionEnumerator(nsISimpleEnumerator
** aResult
,
278 nsISimpleEnumerator
* aFirstEnumerator
,
279 nsISimpleEnumerator
* aSecondEnumerator
)
282 if (!aFirstEnumerator
) {
283 *aResult
= aSecondEnumerator
;
284 } else if (!aSecondEnumerator
) {
285 *aResult
= aFirstEnumerator
;
287 nsUnionEnumerator
* enumer
= new nsUnionEnumerator(aFirstEnumerator
,
290 return NS_ERROR_OUT_OF_MEMORY
;