Bumping gaia.json for 8 gaia revision(s) a=gaia-bump
[gecko.git] / xpcom / ds / nsSupportsArrayEnumerator.cpp
blobc39463390180ade83e29d5048b3070bdc8ef0c14
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
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/. */
6 #include "nsSupportsArrayEnumerator.h"
7 #include "nsISupportsArray.h"
9 nsSupportsArrayEnumerator::nsSupportsArrayEnumerator(nsISupportsArray* array)
10 : mArray(array)
11 , mCursor(0)
13 NS_ASSERTION(array, "null array");
14 NS_ADDREF(mArray);
17 nsSupportsArrayEnumerator::~nsSupportsArrayEnumerator()
19 NS_RELEASE(mArray);
22 NS_IMPL_ISUPPORTS(nsSupportsArrayEnumerator, nsIBidirectionalEnumerator,
23 nsIEnumerator)
25 NS_IMETHODIMP
26 nsSupportsArrayEnumerator::First()
28 mCursor = 0;
29 uint32_t cnt;
30 nsresult rv = mArray->Count(&cnt);
31 if (NS_FAILED(rv)) {
32 return rv;
34 int32_t end = (int32_t)cnt;
35 if (mCursor < end) {
36 return NS_OK;
37 } else {
38 return NS_ERROR_FAILURE;
42 NS_IMETHODIMP
43 nsSupportsArrayEnumerator::Next()
45 uint32_t cnt;
46 nsresult rv = mArray->Count(&cnt);
47 if (NS_FAILED(rv)) {
48 return rv;
50 int32_t end = (int32_t)cnt;
51 if (mCursor < end) { // don't count upward forever
52 mCursor++;
54 if (mCursor < end) {
55 return NS_OK;
56 } else {
57 return NS_ERROR_FAILURE;
61 NS_IMETHODIMP
62 nsSupportsArrayEnumerator::CurrentItem(nsISupports** aItem)
64 NS_ASSERTION(aItem, "null out parameter");
65 uint32_t cnt;
66 nsresult rv = mArray->Count(&cnt);
67 if (NS_FAILED(rv)) {
68 return rv;
70 if (mCursor >= 0 && mCursor < (int32_t)cnt) {
71 return mArray->GetElementAt(mCursor, aItem);
73 return NS_ERROR_FAILURE;
76 NS_IMETHODIMP
77 nsSupportsArrayEnumerator::IsDone()
79 uint32_t cnt;
80 nsresult rv = mArray->Count(&cnt);
81 if (NS_FAILED(rv)) {
82 return rv;
84 // XXX This is completely incompatible with the meaning of nsresult.
85 // NS_ENUMERATOR_FALSE is defined to be 1. (bug 778111)
86 return (mCursor >= 0 && mCursor < (int32_t)cnt)
87 ? (nsresult)NS_ENUMERATOR_FALSE : NS_OK;
90 ////////////////////////////////////////////////////////////////////////////////
92 NS_IMETHODIMP
93 nsSupportsArrayEnumerator::Last()
95 uint32_t cnt;
96 nsresult rv = mArray->Count(&cnt);
97 if (NS_FAILED(rv)) {
98 return rv;
100 mCursor = cnt - 1;
101 return NS_OK;
104 NS_IMETHODIMP
105 nsSupportsArrayEnumerator::Prev()
107 if (mCursor >= 0) {
108 --mCursor;
110 if (mCursor >= 0) {
111 return NS_OK;
112 } else {
113 return NS_ERROR_FAILURE;