blob: 96d8e4cc2c66482239d912d6085d9bffb1b01314 [file] [log] [blame] [edit]
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef LIBBRILLO_BRILLO_CPUINFO_H_
#define LIBBRILLO_BRILLO_CPUINFO_H_
#include <functional>
#include <map>
#include <optional>
#include <string>
#include <vector>
#include <base/files/file_path.h>
#include "brillo/brillo_export.h"
namespace brillo {
// This class provides a bit more structure to the contents of (and only)
// /proc/cpuinfo.
//
// It breaks the data into processor information records that can be accessed
// via a proc_index argument. Each processor record contains a set of string
// keys and values that they map to. You can look up a key to obtain its value
// (if the key exists). Note that some values may be the empty string ("").
class BRILLO_EXPORT CpuInfo final {
public:
~CpuInfo();
CpuInfo(CpuInfo&& other);
CpuInfo& operator=(CpuInfo&& other);
// Returns a CpuInfo object based on a file pointed to by |path|, or
// std::nullopt if |path| could not be read or if there was a parse error.
static std::optional<CpuInfo> Create(
const base::FilePath& path = base::FilePath("/proc/cpuinfo"));
// Returns a CpuInfo object based on the contents of |data|
// or std::nullopt if there was a parse error.
static std::optional<CpuInfo> CreateFromString(std::string_view data);
// Returns the number of processor records that were read. This is different
// from the number of processors in the system as the ones that are not
// online will not have their details reported.
size_t NumProcRecords() const;
// Returns an optional string_view with the value corresponding to the |key|
// for the processor entry at |proc_index|. The lifetime of the string_view
// that is returned is limited to that of the CpuInfo object that it came
// from.
// There are four conditions you should be aware of when using this
// function:
// 1. Your |proc_index| is too big: returns std::nullopt.
// 2. Your |key| doesn't exist: returns std::nullopt.
// 3. |key| exists, but has no associated value: returns empty string.
// 4. |key| exists, and has an associated value: returns the value.
std::optional<std::string_view> LookUp(size_t proc_index,
std::string_view key) const;
static base::FilePath DefaultPath();
private:
CpuInfo();
using Record = std::map<std::string, std::string, std::less<>>;
using RecordsVec = std::vector<Record>;
explicit CpuInfo(RecordsVec proc_records);
static std::optional<RecordsVec> ParseFromString(std::string_view data);
RecordsVec proc_records_;
};
} // namespace brillo
#endif // LIBBRILLO_BRILLO_CPUINFO_H_