1 /* Copyright 2015 The TensorFlow Authors. All Rights Reserved. 2 3 Licensed under the Apache License, Version 2.0 (the "License"); 4 you may not use this file except in compliance with the License. 5 You may obtain a copy of the License at 6 7 http://www.apache.org/licenses/LICENSE-2.0 8 9 Unless required by applicable law or agreed to in writing, software 10 distributed under the License is distributed on an "AS IS" BASIS, 11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 See the License for the specific language governing permissions and 13 limitations under the License. 14 ==============================================================================*/ 15 16 // An iterator yields a sequence of key/value pairs from a source. 17 // The following class defines the interface. Multiple implementations 18 // are provided by this library. In particular, iterators are provided 19 // to access the contents of a Table or a DB. 20 // 21 // Multiple threads can invoke const methods on an Iterator without 22 // external synchronization, but if any of the threads may call a 23 // non-const method, all threads accessing the same Iterator must use 24 // external synchronization. 25 26 #ifndef TENSORFLOW_LIB_IO_ITERATOR_H_ 27 #define TENSORFLOW_LIB_IO_ITERATOR_H_ 28 29 #include "tensorflow/core/lib/core/status.h" 30 #include "tensorflow/core/lib/core/stringpiece.h" 31 32 namespace tensorflow { 33 namespace table { 34 35 class Iterator { 36 public: 37 Iterator(); 38 virtual ~Iterator(); 39 40 // An iterator is either positioned at a key/value pair, or 41 // not valid. This method returns true iff the iterator is valid. 42 virtual bool Valid() const = 0; 43 44 // Position at the first key in the source. The iterator is Valid() 45 // after this call iff the source is not empty. 46 virtual void SeekToFirst() = 0; 47 48 // Position at the first key in the source that is at or past target. 49 // The iterator is Valid() after this call iff the source contains 50 // an entry that comes at or past target. 51 virtual void Seek(const StringPiece& target) = 0; 52 53 // Moves to the next entry in the source. After this call, Valid() is 54 // true iff the iterator was not positioned at the last entry in the source. 55 // REQUIRES: Valid() 56 virtual void Next() = 0; 57 58 // Return the key for the current entry. The underlying storage for 59 // the returned slice is valid only until the next modification of 60 // the iterator. 61 // REQUIRES: Valid() 62 virtual StringPiece key() const = 0; 63 64 // Return the value for the current entry. The underlying storage for 65 // the returned slice is valid only until the next modification of 66 // the iterator. 67 // REQUIRES: Valid() 68 virtual StringPiece value() const = 0; 69 70 // If an error has occurred, return it. Else return an ok status. 71 virtual Status status() const = 0; 72 73 // Clients are allowed to register function/arg1/arg2 triples that 74 // will be invoked when this iterator is destroyed. 75 // 76 // Note that unlike all of the preceding methods, this method is 77 // not abstract and therefore clients should not override it. 78 typedef void (*CleanupFunction)(void* arg1, void* arg2); 79 void RegisterCleanup(CleanupFunction function, void* arg1, void* arg2); 80 81 private: 82 struct Cleanup { 83 CleanupFunction function; 84 void* arg1; 85 void* arg2; 86 Cleanup* next; 87 }; 88 Cleanup cleanup_; 89 90 // No copying allowed 91 Iterator(const Iterator&); 92 void operator=(const Iterator&); 93 }; 94 95 // Return an empty iterator (yields nothing). 96 extern Iterator* NewEmptyIterator(); 97 98 // Return an empty iterator with the specified status. 99 extern Iterator* NewErrorIterator(const Status& status); 100 101 } // namespace table 102 } // namespace tensorflow 103 104 #endif // TENSORFLOW_LIB_IO_ITERATOR_H_ 105