// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
//
#ifndef STORAGE_LEVELDB_UTIL_STORAGE_OPTIONS_H_
#define STORAGE_LEVELDB_UTIL_STORAGE_OPTIONS_H_

#include <string>
#include <stdint.h>
#include "leveldb/env.h"
#include "leveldb/options.h"

namespace leveldb {

// Environment Options that are used to read files from storage
class StorageOptions : public EnvOptions {
 public:
  /* implicit */ StorageOptions(const Options& opt) :
    data_in_os_(opt.allow_os_buffer),
    fs_readahead_(opt.allow_readahead),
    readahead_compactions_(opt.allow_readahead_compactions),
    use_mmap_reads_(opt.allow_mmap_reads),
    use_mmap_writes_(opt.allow_mmap_writes),
    set_fd_cloexec_(opt.is_fd_close_on_exec)
    {
  }

  // copy constructor with readaheads set to readahead_compactions_
  StorageOptions(const StorageOptions& opt) {
    data_in_os_ = opt.UseOsBuffer();
    fs_readahead_ = opt.UseReadaheadCompactions();
    readahead_compactions_ = opt.UseReadaheadCompactions();
    use_mmap_reads_ = opt.UseMmapReads();
    use_mmap_writes_ = opt.UseMmapWrites();
    set_fd_cloexec_ = opt.IsFDCloseOnExec();
  }

  // constructor with default options
  StorageOptions() {
    Options opt;
    data_in_os_ = opt.allow_os_buffer;
    fs_readahead_ = opt.allow_readahead;
    readahead_compactions_ = fs_readahead_;
    use_mmap_reads_ = opt.allow_mmap_reads;
    use_mmap_writes_ = opt.allow_mmap_writes;
    set_fd_cloexec_ = opt.is_fd_close_on_exec;
  }

  virtual ~StorageOptions() {}

  bool UseOsBuffer() const { return data_in_os_; };
  bool UseReadahead() const { return fs_readahead_; };
  bool UseMmapReads() const { return use_mmap_reads_; }
  bool UseMmapWrites() const { return use_mmap_writes_; }
  bool UseReadaheadCompactions() const { return readahead_compactions_;}
  bool IsFDCloseOnExec() const { return set_fd_cloexec_;}

  void DisableMmapWrites() {
    use_mmap_writes_ = false;
  }

 private:
  bool data_in_os_;
  bool fs_readahead_;
  bool readahead_compactions_;
  bool use_mmap_reads_;
  bool use_mmap_writes_;
  bool set_fd_cloexec_;
};

}  // namespace leveldb

#endif  // STORAGE_LEVELDB_UTIL_STORAGE_OPTIONS_H_