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 "nsIStringEnumerator.h"
12 #include "nsSimpleEnumerator.h"
15 #include "mozilla/RefPtr.h"
17 class EmptyEnumeratorImpl
: public nsSimpleEnumerator
,
18 public nsIUTF8StringEnumerator
,
19 public nsIStringEnumerator
{
21 EmptyEnumeratorImpl() = default;
23 // nsISupports interface. Not really inherited, but no mRefCnt.
24 NS_DECL_ISUPPORTS_INHERITED
26 // nsISimpleEnumerator
27 NS_DECL_NSISIMPLEENUMERATOR
28 NS_DECL_NSIUTF8STRINGENUMERATOR
29 NS_DECL_NSISTRINGENUMERATORBASE
30 // can't use NS_DECL_NSISTRINGENUMERATOR because they share the
31 // HasMore() signature
33 NS_IMETHOD
GetNext(nsAString
& aResult
) override
;
35 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) { return 2; }
45 NS_IMETHODIMP_(MozExternalRefCountType
)
46 EmptyEnumeratorImpl::Release(void) { return 1; }
48 NS_IMPL_QUERY_INTERFACE_INHERITED(EmptyEnumeratorImpl
, nsSimpleEnumerator
,
49 nsIUTF8StringEnumerator
, nsIStringEnumerator
)
51 // nsISimpleEnumerator interface
53 EmptyEnumeratorImpl::HasMoreElements(bool* aResult
) {
59 EmptyEnumeratorImpl::HasMore(bool* aResult
) {
65 EmptyEnumeratorImpl::GetNext(nsISupports
** aResult
) { return NS_ERROR_FAILURE
; }
68 EmptyEnumeratorImpl::GetNext(nsACString
& aResult
) {
69 return NS_ERROR_UNEXPECTED
;
73 EmptyEnumeratorImpl::GetNext(nsAString
& aResult
) { return NS_ERROR_UNEXPECTED
; }
76 EmptyEnumeratorImpl::StringIterator(nsIJSEnumerator
** aRetVal
) {
77 return NS_ERROR_NOT_IMPLEMENTED
;
80 nsresult
NS_NewEmptyEnumerator(nsISimpleEnumerator
** aResult
) {
81 *aResult
= EmptyEnumeratorImpl::GetInstance();
85 ////////////////////////////////////////////////////////////////////////////////
87 class nsSingletonEnumerator final
: public nsSimpleEnumerator
{
89 // nsISimpleEnumerator methods
90 NS_IMETHOD
HasMoreElements(bool* aResult
) override
;
91 NS_IMETHOD
GetNext(nsISupports
** aResult
) override
;
93 explicit nsSingletonEnumerator(nsISupports
* aValue
);
96 ~nsSingletonEnumerator() override
;
99 nsCOMPtr
<nsISupports
> mValue
;
103 nsSingletonEnumerator::nsSingletonEnumerator(nsISupports
* aValue
)
105 mConsumed
= (mValue
? false : true);
108 nsSingletonEnumerator::~nsSingletonEnumerator() = default;
111 nsSingletonEnumerator::HasMoreElements(bool* aResult
) {
112 MOZ_ASSERT(aResult
!= 0, "null ptr");
114 return NS_ERROR_NULL_POINTER
;
117 *aResult
= !mConsumed
;
122 nsSingletonEnumerator::GetNext(nsISupports
** aResult
) {
123 MOZ_ASSERT(aResult
!= 0, "null ptr");
125 return NS_ERROR_NULL_POINTER
;
129 return NS_ERROR_FAILURE
;
139 nsresult
NS_NewSingletonEnumerator(nsISimpleEnumerator
** aResult
,
140 nsISupports
* aSingleton
) {
141 RefPtr
<nsSingletonEnumerator
> enumer
= new nsSingletonEnumerator(aSingleton
);
142 enumer
.forget(aResult
);
146 ////////////////////////////////////////////////////////////////////////////////
148 class nsUnionEnumerator final
: public nsSimpleEnumerator
{
150 // nsISimpleEnumerator methods
151 NS_IMETHOD
HasMoreElements(bool* aResult
) override
;
152 NS_IMETHOD
GetNext(nsISupports
** aResult
) override
;
154 nsUnionEnumerator(nsISimpleEnumerator
* aFirstEnumerator
,
155 nsISimpleEnumerator
* aSecondEnumerator
);
158 ~nsUnionEnumerator() override
;
161 nsCOMPtr
<nsISimpleEnumerator
> mFirstEnumerator
, mSecondEnumerator
;
166 nsUnionEnumerator::nsUnionEnumerator(nsISimpleEnumerator
* aFirstEnumerator
,
167 nsISimpleEnumerator
* aSecondEnumerator
)
168 : mFirstEnumerator(aFirstEnumerator
),
169 mSecondEnumerator(aSecondEnumerator
),
173 nsUnionEnumerator::~nsUnionEnumerator() = default;
176 nsUnionEnumerator::HasMoreElements(bool* aResult
) {
177 MOZ_ASSERT(aResult
!= 0, "null ptr");
179 return NS_ERROR_NULL_POINTER
;
190 rv
= mFirstEnumerator
->HasMoreElements(aResult
);
202 rv
= mSecondEnumerator
->HasMoreElements(aResult
);
217 nsUnionEnumerator::GetNext(nsISupports
** aResult
) {
218 MOZ_ASSERT(aResult
!= 0, "null ptr");
220 return NS_ERROR_NULL_POINTER
;
224 return NS_ERROR_FAILURE
;
228 return mFirstEnumerator
->GetNext(aResult
);
231 return mSecondEnumerator
->GetNext(aResult
);
234 nsresult
NS_NewUnionEnumerator(nsISimpleEnumerator
** aResult
,
235 nsISimpleEnumerator
* aFirstEnumerator
,
236 nsISimpleEnumerator
* aSecondEnumerator
) {
238 if (!aFirstEnumerator
) {
239 *aResult
= aSecondEnumerator
;
240 } else if (!aSecondEnumerator
) {
241 *aResult
= aFirstEnumerator
;
243 auto* enumer
= new nsUnionEnumerator(aFirstEnumerator
, aSecondEnumerator
);