SlHelpers
CveShaMap.h
1 // SPDX-License-Identifier: GPL-2.0-only
2 
3 #pragma once
4 
5 #include <algorithm>
6 #include <filesystem>
7 #include <set>
8 #include <string>
9 #include <string_view>
10 #include <unordered_map>
11 #include <vector>
12 
13 #include "../helpers/String.h"
14 
15 namespace SlCVEs {
16 
20 class CveShaMap {
21 public:
23  using CveShaMapTy = std::unordered_multimap<std::string, std::string,
26  using ShaCveMapTy = std::unordered_map<std::string, std::string,
28 
30  enum struct ShaSize {
31  Long,
32  Short
33  };
34 
35  CveShaMap() = delete;
36 
37  CveShaMap(const CveShaMap &) = delete;
38  CveShaMap &operator=(const CveShaMap &) = delete;
39 
41  CveShaMap(CveShaMap &&) = default;
43  CveShaMap &operator=(CveShaMap &&) = default;
44 
53  CveShaMap(const std::filesystem::path &vsource = {},
54  ShaSize shaSize = ShaSize::Long,
55  const std::string &branch = "origin/master",
56  unsigned year = 0,
57  bool rejected = false);
58 
64  std::string_view getCve(std::string_view shaCommit) const {
65  const auto it = m_shaCveMap.find(shaCommit);
66  if (it != m_shaCveMap.cend())
67  return it->second;
68 
69  return {};
70  }
71 
77  std::vector<std::string> getShas(std::string_view cveNumber) const { //requires (S == ShaSize::Long)
78  std::vector<std::string> ret;
79  const auto range = m_cveShaMap.equal_range(cveNumber);
80  std::transform(range.first, range.second, std::back_inserter(ret),
81  [](const auto &p) { return p.second; });
82  return ret;
83  }
84 
89  std::set<std::string> getAllCves() const { //requires (S == ShaSize::Long)
90  std::set<std::string> ret;
91  std::transform(m_cveShaMap.cbegin(), m_cveShaMap.cend(),
92  std::inserter(ret, ret.end()),
93  [](const auto &p) { return p.first; });
94  return ret;
95  }
96 
97 private:
98  CveShaMapTy m_cveShaMap;
99  ShaCveMapTy m_shaCveMap;
100 };
101 
102 }
std::unordered_multimap< std::string, std::string, SlHelpers::String::Hash, SlHelpers::String::Eq > CveShaMapTy
CVE -> upstream SHA mapping.
Definition: CveShaMap.h:24
ShaSize
Store Long or Short SHAs.
Definition: CveShaMap.h:30
Equality test for string and string_view to be used in containers.
Definition: String.h:281
Hash for string and string_view to be used in hashing containers.
Definition: String.h:254
std::unordered_map< std::string, std::string, SlHelpers::String::Hash, SlHelpers::String::Eq > ShaCveMapTy
Upstream SHA -> CVE mapping.
Definition: CveShaMap.h:27
std::vector< std::string > getShas(std::string_view cveNumber) const
Get SHAs for cveNumber.
Definition: CveShaMap.h:77
Definition: CVE.h:8
A map between CVE numbers and upstream SHAs.
Definition: CveShaMap.h:20
std::string_view getCve(std::string_view shaCommit) const
Get CVE number for shaCommit.
Definition: CveShaMap.h:64
std::set< std::string > getAllCves() const
Get all stored CVE numbers.
Definition: CveShaMap.h:89