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