// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_ASH_FILEAPI_FILE_ACCUMULATOR_H_
#define CHROME_BROWSER_ASH_FILEAPI_FILE_ACCUMULATOR_H_
#include <vector>
#include "chrome/browser/ash/fileapi/recent_file.h"
namespace ash {
// Accumulator of files located via search operation. The accumulator has a
// limited capacity. Files are sorted based on the RecentFileComparator class.
// If one adds n > max_capacity files, (n - max_capacity) files are discarded
// based on the order given by the comparator class.
//
// Typical use consists of adding a number of files, then Get'ing the content.
// Once the content is Get'ed, the accumulator is sealed, meaning no new files
// may be added to the accumulator. To unseal the accumulator, call the Clear
// method on it, which also removes all stored files.
//
// FilesAccumulator<RecentFilesComparator> acc(100);
// acc.Add(recent_file_1);
// ..
// acc.Add(recent_file_n);
// std::vector<RecentFile> content = acc.Get();
class FileAccumulator {
public:
// Creates an accumulator with the given capacity. The capacity
// limits the maximum number of files that can be added via the Add method.
explicit FileAccumulator(size_t max_capacity);
FileAccumulator(FileAccumulator&& accumulator);
~FileAccumulator();
// Adds a single file to the accumulator. The return value indicates if the
// file has been added or not. A file may not be added if the accumulator is
// sealed.
bool Add(const RecentFile& file);
// Returns the content of this accumulator. The first time this method is
// called it "seals" this accumulator, re-orders the files from a heap to a
// simple vector. This method can be called multiple times.
const std::vector<RecentFile>& Get();
// Clears the accumulator and unseals it.
void Clear();
// Returns the maximum number of recent files that are can be stored in this
// cache.
size_t max_capacity() const { return max_capacity_; }
private:
// The maximum number of recent files kept in this cache.
const size_t max_capacity_;
// Whether or not the accumulator is in the sealed state.
bool sealed_;
// The content of the cache, kept sorted by the modified time.
std::vector<RecentFile> files_;
};
} // namespace ash
#endif // CHROME_BROWSER_ASH_FILEAPI_FILE_ACCUMULATOR_H_