// Copyright 2015 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROMIUMOS_WIDE_PROFILING_DATA_READER_H_
#define CHROMIUMOS_WIDE_PROFILING_DATA_READER_H_

#include <stddef.h>

#include "chromiumos-wide-profiling/compat/string.h"
#include "chromiumos-wide-profiling/utils.h"

namespace quipper {

class DataReader {
 public:
  DataReader() : is_cross_endian_(false) {}
  virtual ~DataReader() {}

  // Moves the data read pointer to |offset| bytes from the beginning of the
  // data.
  virtual void SeekSet(size_t offset) = 0;

  // Returns the position of the data read pointer, in bytes from the beginning
  // of the data.
  virtual size_t Tell() const = 0;

  virtual size_t size() const {
    return size_;
  }

  // Reads raw data into |dest|. Returns true if it managed to read |size|
  // bytes.
  virtual bool ReadData(const size_t size, void* dest) = 0;

  // Like ReadData(), but prints an error if it doesn't read all |size| bytes.
  virtual bool ReadDataValue(const size_t size, const string& value_name,
                             void* dest);

  // Read integers with endian swapping.
  bool ReadUint16(uint16_t* value) {
    return ReadIntValue(value);
  }
  bool ReadUint32(uint32_t* value) {
    return ReadIntValue(value);
  }
  bool ReadUint64(uint64_t* value) {
    return ReadIntValue(value);
  }

  // Read a string. Returns true if it managed to read |size| bytes (excluding
  // null terminator). The actual string may be shorter than the number of bytes
  // requested.
  virtual bool ReadString(const size_t size, string* str) = 0;

  bool is_cross_endian() const {
    return is_cross_endian_;
  }

  void set_is_cross_endian(bool value) {
    is_cross_endian_ = value;
  }

 protected:
  // Size of the data source.
  size_t size_;

 private:
  // Like ReadData(), but used specifically to read integers. Will swap byte
  // order if necessary.
  // For type-safety this one private and let public member functions call it.
  template <typename T>
  bool ReadIntValue(T* dest) {
    if (!ReadData(sizeof(T), dest))
      return false;
    *dest = MaybeSwap(*dest, is_cross_endian_);
    return true;
  }

  // For cross-endian data reading.
  bool is_cross_endian_;
};

}  // namespace quipper

#endif  // CHROMIUMOS_WIDE_PROFILING_DATA_READER_H_
