summaryrefslogtreecommitdiffstats
path: root/xpcom/ds/nsSupportsArrayEnumerator.cpp
blob: 3eb6a7a58cf9145afd6b17d9748ae0b56dc5b4bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "nsSupportsArrayEnumerator.h"

// Disable deprecation warnings generated by nsISupportsArray and associated
// classes.
#if defined(__GNUC__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#elif defined(_MSC_VER)
#pragma warning (push)
#pragma warning (disable : 4996)
#endif

#include "nsISupportsArray.h"

nsSupportsArrayEnumerator::nsSupportsArrayEnumerator(nsISupportsArray* array)
  : mArray(array)
  , mCursor(0)
{
  NS_ASSERTION(array, "null array");
}

nsSupportsArrayEnumerator::~nsSupportsArrayEnumerator()
{
}

NS_IMPL_ISUPPORTS(nsSupportsArrayEnumerator, nsIBidirectionalEnumerator,
                  nsIEnumerator)

NS_IMETHODIMP
nsSupportsArrayEnumerator::First()
{
  mCursor = 0;
  uint32_t cnt;
  nsresult rv = mArray->Count(&cnt);
  if (NS_FAILED(rv)) {
    return rv;
  }
  int32_t end = (int32_t)cnt;
  if (mCursor < end) {
    return NS_OK;
  } else {
    return NS_ERROR_FAILURE;
  }
}

NS_IMETHODIMP
nsSupportsArrayEnumerator::Next()
{
  uint32_t cnt;
  nsresult rv = mArray->Count(&cnt);
  if (NS_FAILED(rv)) {
    return rv;
  }
  int32_t end = (int32_t)cnt;
  if (mCursor < end) { // don't count upward forever
    mCursor++;
  }
  if (mCursor < end) {
    return NS_OK;
  } else {
    return NS_ERROR_FAILURE;
  }
}

NS_IMETHODIMP
nsSupportsArrayEnumerator::CurrentItem(nsISupports** aItem)
{
  NS_ASSERTION(aItem, "null out parameter");
  uint32_t cnt;
  nsresult rv = mArray->Count(&cnt);
  if (NS_FAILED(rv)) {
    return rv;
  }
  if (mCursor >= 0 && mCursor < (int32_t)cnt) {
    return mArray->GetElementAt(mCursor, aItem);
  }
  return NS_ERROR_FAILURE;
}

NS_IMETHODIMP
nsSupportsArrayEnumerator::IsDone()
{
  uint32_t cnt;
  nsresult rv = mArray->Count(&cnt);
  if (NS_FAILED(rv)) {
    return rv;
  }
  // XXX This is completely incompatible with the meaning of nsresult.
  // NS_ENUMERATOR_FALSE is defined to be 1.  (bug 778111)
  return (mCursor >= 0 && mCursor < (int32_t)cnt)
    ? (nsresult)NS_ENUMERATOR_FALSE : NS_OK;
}

////////////////////////////////////////////////////////////////////////////////

NS_IMETHODIMP
nsSupportsArrayEnumerator::Last()
{
  uint32_t cnt;
  nsresult rv = mArray->Count(&cnt);
  if (NS_FAILED(rv)) {
    return rv;
  }
  mCursor = cnt - 1;
  return NS_OK;
}

NS_IMETHODIMP
nsSupportsArrayEnumerator::Prev()
{
  if (mCursor >= 0) {
    --mCursor;
  }
  if (mCursor >= 0) {
    return NS_OK;
  } else {
    return NS_ERROR_FAILURE;
  }
}

#if defined(__GNUC__)
#pragma GCC diagnostic pop
#elif defined(_MSC_VER)
#pragma warning (pop)
#endif