1333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com/*
2333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * Copyright 2011 Google Inc. All Rights Reserved.
3333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com *
4333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * Licensed under the Apache License, Version 2.0 (the "License");
5333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * you may not use this file except in compliance with the License.
6333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * You may obtain a copy of the License at
7333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com *
8333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com *      http://www.apache.org/licenses/LICENSE-2.0
9333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com *
10333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * Unless required by applicable law or agreed to in writing, software
11333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * distributed under the License is distributed on an "AS IS" BASIS,
12333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * See the License for the specific language governing permissions and
14333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com * limitations under the License.
15333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com */
16333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
17333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#ifndef SFNTLY_CPP_SRC_SFNTLY_PORT_JAVA_ITERATOR_H_
18333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#define SFNTLY_CPP_SRC_SFNTLY_PORT_JAVA_ITERATOR_H_
19333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
20333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#include "sfntly/port/refcount.h"
21333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
22333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com// Interface of Java iterator.
23333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com// This is a forward read-only iterator that represents java.util.Iterator<E>
24333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
25333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comnamespace sfntly {
26333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
27333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comtemplate <typename ReturnType, typename ContainerBase>
28333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comclass Iterator : public virtual RefCount {
29333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com public:
30333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  virtual ~Iterator() {}
31333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  virtual ContainerBase* container_base() = 0;
32333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
33333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com protected:
34333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  Iterator() {}
35333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  NO_COPY_AND_ASSIGN(Iterator);
36333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com};
37333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
38333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comtemplate <typename ReturnType, typename Container,
39333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com          typename ContainerBase = Container>
40333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comclass PODIterator : public Iterator<ReturnType, ContainerBase>,
41333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                    public RefCounted< PODIterator<ReturnType, Container> > {
42333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com public:
43333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  explicit PODIterator(Container* container) : container_(container) {}
44333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  virtual ~PODIterator() {}
45333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  virtual ContainerBase* container_base() {
46333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    return static_cast<ContainerBase*>(container_);
47333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
48333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
49333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  virtual bool HasNext() = 0;
50333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  virtual ReturnType Next() = 0;
51333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  virtual void Remove() {
52333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#if !defined (SFNTLY_NO_EXCEPTION)
53333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    // Default to no support.
54333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    throw UnsupportedOperationException();
55333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#endif
56333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
57333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
58333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com protected:
59333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  Container* container() { return container_; }
60333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
61333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com private:
62333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  Container* container_;  // Dumb pointer is used to avoid circular ref-counting
63333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com};
64333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
65333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comtemplate <typename ReturnType, typename Container,
66333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com          typename ContainerBase = Container>
67333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.comclass RefIterator : public Iterator<ReturnType, ContainerBase>,
68333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com                    public RefCounted< RefIterator<ReturnType, Container> > {
69333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com public:
70333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  explicit RefIterator(Container* container) : container_(container) {}
71333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  virtual ~RefIterator() {}
72333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  virtual ContainerBase* container_base() {
73333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    return static_cast<ContainerBase*>(container_);
74333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
75333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
76333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  virtual bool HasNext() = 0;
77333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  CALLER_ATTACH virtual ReturnType* Next() = 0;
78333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  virtual void Remove() {
79333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#if !defined (SFNTLY_NO_EXCEPTION)
80333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    // Default to no support.
81333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com    throw UnsupportedOperationException();
82333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#endif
83333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  }
84333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
85333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com protected:
86333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  Container* container() { return container_; }
87333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
88333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com private:
89333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com  Container* container_;  // Dumb pointer is used to avoid circular ref-counting
90333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com};
91333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
92333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com}  // namespace sfntly
93333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com
94333edd91cb32d6acfd0307ba2ae8f60baed75ff4arthurhsu@google.com#endif  // SFNTLY_CPP_SRC_SFNTLY_PORT_JAVA_ITERATOR_H_
95