#include <iostream>
#include <vector>
#include <string>
enum RaidLevel { RAID0, RAID1, NUM_RAID_LEVELS };
class RAID {
public:
virtual void writeData(const std::string& data) = 0;
virtual std::string readData() const = 0;
virtual ~RAID() = default;
};
class RAID0 : public RAID {
public:
RAID0(int numDisks) : numDisks(numDisks) {
disks.resize(numDisks);
}
void writeData(const std::string& data) override {
for (int i = 0; i < numDisks; ++i) {
disks[i] = data.substr(i * (data.size() / numDisks), data.size() / numDisks);
}
}
std::string readData() const override {
std::string result;
for (const auto& disk : disks) {
result += disk;
}
return result;
}
private:
int numDisks;
std::vector<std::string> disks;
};
class RAID1 : public RAID {
public:
RAID1(int numDisks) : numDisks(numDisks) {
disks.resize(numDisks);
}
void writeData(const std::string& data) override {
// Write to the first disk and mirror it to others
disks[0] = data;
for (int i = 1; i < numDisks; ++i) {
disks[i] = disks[0];
}
}
std::string readData() const override {
// Data from the first disk (mirrored)
return disks[0];
}
private:
int numDisks;
std::vector<std::string> disks;
};
void simulateRaid(RaidLevel level, const std::string& data) {
std::unique_ptr<RAID> raid;
if (level == RAID0) {
raid = std::make_unique<RAID0>(2); // Example with 2 disks
} else if (level == RAID1) {
raid = std::make_unique<RAID1>(2); // Example with 2 disks
}
if (raid) {
raid->writeData(data);
std::cout << "Read data from RAID level " << level << ": " << raid->readData() << "\n";
}
}
int main() {
std::string data = "This is sample data for RAID simulation.";
std::cout << "Simulating RAID 0:\n";
simulateRaid(RAID0, data);
std::cout << "Simulating RAID 1:\n";
simulateRaid(RAID1, data);
return 0;
}