// ================== FYLESYSTEMOBJECT ================== #ifndef FILE_SYSTEM_OBJECT_H #define FILE_SYSTEM_OBJECT_H #include #include class FileSystemObject { std::weak_ptr parent; std::string name; public: FileSystemObject(std::string name) : name(name) {} std::string getPath() const { auto parentPtr = parent.lock(); if (parent.lock()) { return parentPtr->getPath() + "/" + this->name; } else { return this->name; } } std::string getName() const { return this->name; } void setParent(const std::weak_ptr& parent) { this->parent = parent; } std::weak_ptr getParent() const { return this->parent; } virtual size_t getSize() const = 0; virtual ~FileSystemObject() {} }; #endif // ================!FILE_SYSTEM_OBJECT_H ================ // ================ FILE_SYSTEM_OBJECT_CONTAINER ================ #ifndef FILE_SYSTEM_OBJECTS_CONTAINER_H #define FILE_SYSTEM_OBJECTS_CONTAINER_H #include #include #include "FileSystemObject.h" class FileSystemObjectsContainer { public: virtual void add(const std::shared_ptr& obj) = 0; virtual std::vector >::const_iterator begin() const = 0; virtual std::vector >::const_iterator end() const = 0; virtual ~FileSystemObjectsContainer() {} }; #endif // !FILE_SYSTEM_OBJECTS_CONTAINER_H // ============= MAIN.CPP =========== #include #include #include #include #include #include #include #include #include "FileSystemObject.h" #include "ByteContainer.h" #include "File.h" #include "FileSystemObjectsContainer.h" #include "Directory.h" #include "TreeView.h" std::string leftTrim(std::string s) { s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](int c) {return !std::isspace(c); })); return s; } class Shortcuts : public FileSystemObject, public FileSystemObjectsContainer { std::vector > items; public: Shortcuts() : FileSystemObject("[shortcuts]") {} void add(const std::shared_ptr& obj) override { this->items.push_back(obj); } std::vector >::const_iterator begin() const override { return this->items.begin(); } std::vector >::const_iterator end() const override { return this->items.end(); } size_t getSize() const override { return 0; } }; void moveTo(std::shared_ptr obj, std::shared_ptr container) { container->add(obj); obj->setParent(container); } int main() { std::map > objectsById; std::map > directoriesById; std::shared_ptr shortcuts; std::string line; while (std::getline(std::cin, line) && line != "end") { std::istringstream lineIn(line); std::string command; int id; std::shared_ptr newObject = nullptr; lineIn >> command; if (command == "file") { std::string filename; lineIn >> id >> filename; std::string contents; std::getline(lineIn, contents); newObject = std::make_shared(filename, contents); } else if (command == "directory") { std::string directory; lineIn >> id >> directory; std::shared_ptr newDirectory = std::make_shared(directory); directoriesById[id] = newDirectory; newObject = newDirectory; } else if (command == "move") { int destinationId; lineIn >> id >> destinationId; moveTo(objectsById[id], directoriesById[destinationId]); } else if (command == "shortcut") { int targetId; lineIn >> targetId; if (!shortcuts) { shortcuts = std::make_shared(); newObject = shortcuts; // save the shortcuts object under a non-conflicting id id = -1; } shortcuts->add(objectsById[targetId]); } if (newObject) { objectsById[id] = newObject; } } std::vector > rootObjects; for (auto idAndObject : objectsById) { auto parentPtr = idAndObject.second->getParent().lock(); if (!parentPtr) { rootObjects.push_back(idAndObject.second); } } std::sort(rootObjects.begin(), rootObjects.end(), [](const std::shared_ptr a, const std::shared_ptr b) { return a->getName() < b->getName(); }); std::cout << getTreeView(rootObjects) << std::endl; return 0; }