// Copyright (c) 2014 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 METRICS_PERSISTENT_INTEGER_H_
#define METRICS_PERSISTENT_INTEGER_H_

#include <stdint.h>

#include <string>

#include <base/files/file_path.h>
#include <base/macros.h>
#include <base/strings/string_piece.h>

namespace chromeos_metrics {

// PersistentIntegers is a 64-bit integer value backed by a file.
// The in-memory value acts as a write-through cache of the file value.
// If the backing file doesn't exist or has bad content, the value is 0.

class PersistentInteger {
 public:
  // |backing_file_path| is the path to a file that is created, read and
  // written in order to preserves the integer value across restarts of the
  // program using it.  The directory of the file must exist.
  explicit PersistentInteger(const base::FilePath& backing_file_path);
  PersistentInteger(const PersistentInteger&) = delete;
  PersistentInteger& operator=(const PersistentInteger&) = delete;

  // Virtual only because of mock.
  virtual ~PersistentInteger();

  // Sets the value.  This writes through to the backing file.
  void Set(int64_t v);

  // Gets the value.  May sync from backing file first.
  int64_t Get();

  // Convenience function for Get() followed by Set(0).
  // Virtual only because of mock.
  virtual int64_t GetAndClear();

  // Convenience function for v = Get, Set(v + x).
  // Virtual only because of mock.
  virtual void Add(int64_t x);

  // Convenience function for v = Get, Set(max(v, x)).
  // Virtual only because of mock.
  virtual void Max(int64_t x);

 private:
  static const int kVersion = 1001;

  // Writes |value_| to the backing file, creating it if necessary.
  void Write();

  // Reads the value from the backing file, stores it in |value_|, and returns
  // true if the backing file is valid.  Returns false otherwise, and creates
  // a valid backing file as a side effect.
  bool Read();

  base::FilePath path_;
  bool synced_;
  int64_t value_;
  int32_t version_;

  static bool testing_;
};

}  // namespace chromeos_metrics

#endif  // METRICS_PERSISTENT_INTEGER_H_
