1a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain/* Copyright 2016 The TensorFlow Authors. All Rights Reserved.
2a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain
3a4bbacf14882f60525947c1b543b0ad250c793dbRohan JainLicensed under the Apache License, Version 2.0 (the "License");
4a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jainyou may not use this file except in compliance with the License.
5a4bbacf14882f60525947c1b543b0ad250c793dbRohan JainYou may obtain a copy of the License at
6a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain
7a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain    http://www.apache.org/licenses/LICENSE-2.0
8a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain
9a4bbacf14882f60525947c1b543b0ad250c793dbRohan JainUnless required by applicable law or agreed to in writing, software
10a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jaindistributed under the License is distributed on an "AS IS" BASIS,
11a4bbacf14882f60525947c1b543b0ad250c793dbRohan JainWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12a4bbacf14882f60525947c1b543b0ad250c793dbRohan JainSee the License for the specific language governing permissions and
13a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jainlimitations under the License.
14a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain==============================================================================*/
15a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain
16a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain#ifndef TENSORFLOW_LIB_IO_RANDOM_INPUTSTREAM_H_
17a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain#define TENSORFLOW_LIB_IO_RANDOM_INPUTSTREAM_H_
18a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain
19a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain#include "tensorflow/core/lib/io/inputstream_interface.h"
20a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain#include "tensorflow/core/platform/file_system.h"
21a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain
22a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jainnamespace tensorflow {
23a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jainnamespace io {
24a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain
25a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain// Wraps a RandomAccessFile in an InputStreamInterface. A given instance of
26a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain// RandomAccessInputStream is NOT safe for concurrent use by multiple threads.
27a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jainclass RandomAccessInputStream : public InputStreamInterface {
28a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain public:
290f605abad3b30594416dc627860102e3382d6deaRohan Jain  // Does not take ownership of 'file' unless owns_file is set to true. 'file'
300f605abad3b30594416dc627860102e3382d6deaRohan Jain  // must outlive *this.
310f605abad3b30594416dc627860102e3382d6deaRohan Jain  RandomAccessInputStream(RandomAccessFile* file, bool owns_file = false);
320f605abad3b30594416dc627860102e3382d6deaRohan Jain
330f605abad3b30594416dc627860102e3382d6deaRohan Jain  ~RandomAccessInputStream();
34a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain
35a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain  Status ReadNBytes(int64 bytes_to_read, string* result) override;
36a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain
37ee8b13791a921964cad1fc699e72ff1f738b704fYong Tang  Status SkipNBytes(int64 bytes_to_skip) override;
38ee8b13791a921964cad1fc699e72ff1f738b704fYong Tang
39b65a2957ba433b0ed0e529696991af4cc818f1c1Rohan Jain  int64 Tell() const override;
40a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain
4163a7a30e6bd091f87be1de2305c6d882d68ba6a8Vijay Vasudevan  Status Seek(int64 position) {
4263a7a30e6bd091f87be1de2305c6d882d68ba6a8Vijay Vasudevan    pos_ = position;
4363a7a30e6bd091f87be1de2305c6d882d68ba6a8Vijay Vasudevan    return Status::OK();
4463a7a30e6bd091f87be1de2305c6d882d68ba6a8Vijay Vasudevan  }
4563a7a30e6bd091f87be1de2305c6d882d68ba6a8Vijay Vasudevan
4663a7a30e6bd091f87be1de2305c6d882d68ba6a8Vijay Vasudevan  Status Reset() override { return Seek(0); }
4763a7a30e6bd091f87be1de2305c6d882d68ba6a8Vijay Vasudevan
48a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain private:
49a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain  RandomAccessFile* file_;  // Not owned.
50a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain  int64 pos_ = 0;           // Tracks where we are in the file.
510f605abad3b30594416dc627860102e3382d6deaRohan Jain  bool owns_file_ = false;
52a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain};
53a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain
54a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain}  // namespace io
55a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain}  // namespace tensorflow
56a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain
57a4bbacf14882f60525947c1b543b0ad250c793dbRohan Jain#endif  // TENSORFLOW_LIB_IO_RANDOM_INPUTSTREAM_H_
58