1/*
2 * Copyright 2011 Google Inc. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef SFNTLY_CPP_SRC_SFNTLY_PORT_JAVA_ITERATOR_H_
18#define SFNTLY_CPP_SRC_SFNTLY_PORT_JAVA_ITERATOR_H_
19
20#include "sfntly/port/refcount.h"
21
22// Interface of Java iterator.
23// This is a forward read-only iterator that represents java.util.Iterator<E>
24
25namespace sfntly {
26
27template <typename ReturnType, typename ContainerBase>
28class Iterator : public virtual RefCount {
29 public:
30  virtual ~Iterator() {}
31  virtual ContainerBase* container_base() = 0;
32
33 protected:
34  Iterator() {}
35  NO_COPY_AND_ASSIGN(Iterator);
36};
37
38template <typename ReturnType, typename Container,
39          typename ContainerBase = Container>
40class PODIterator : public Iterator<ReturnType, ContainerBase>,
41                    public RefCounted< PODIterator<ReturnType, Container> > {
42 public:
43  explicit PODIterator(Container* container) : container_(container) {}
44  virtual ~PODIterator() {}
45  virtual ContainerBase* container_base() {
46    return static_cast<ContainerBase*>(container_);
47  }
48
49  virtual bool HasNext() = 0;
50  virtual ReturnType Next() = 0;
51  virtual void Remove() {
52#if !defined (SFNTLY_NO_EXCEPTION)
53    // Default to no support.
54    throw UnsupportedOperationException();
55#endif
56  }
57
58 protected:
59  Container* container() { return container_; }
60
61 private:
62  Container* container_;  // Dumb pointer is used to avoid circular ref-counting
63};
64
65template <typename ReturnType, typename Container,
66          typename ContainerBase = Container>
67class RefIterator : public Iterator<ReturnType, ContainerBase>,
68                    public RefCounted< RefIterator<ReturnType, Container> > {
69 public:
70  explicit RefIterator(Container* container) : container_(container) {}
71  virtual ~RefIterator() {}
72  virtual ContainerBase* container_base() {
73    return static_cast<ContainerBase*>(container_);
74  }
75
76  virtual bool HasNext() = 0;
77  CALLER_ATTACH virtual ReturnType* Next() = 0;
78  virtual void Remove() {
79#if !defined (SFNTLY_NO_EXCEPTION)
80    // Default to no support.
81    throw UnsupportedOperationException();
82#endif
83  }
84
85 protected:
86  Container* container() { return container_; }
87
88 private:
89  Container* container_;  // Dumb pointer is used to avoid circular ref-counting
90};
91
92}  // namespace sfntly
93
94#endif  // SFNTLY_CPP_SRC_SFNTLY_PORT_JAVA_ITERATOR_H_
95