Refactored #7 out into class files like I should have to begin with.
This commit is contained in:
		
							
								
								
									
										21
									
								
								2022/7/File.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								2022/7/File.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					#include "File.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					File::File(const std::string &set_filename, unsigned long set_size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						this->size = set_size;
 | 
				
			||||||
 | 
						this->filename = set_filename;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					File::~File()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const std::string& File::Filename() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return filename;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsigned long File::Size() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return size;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										19
									
								
								2022/7/File.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								2022/7/File.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					#ifndef ADVENT_DVEREB_FILE_H
 | 
				
			||||||
 | 
					#define ADVENT_DVEREB_FILE_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class File {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
						File(const std::string &set_filename, unsigned long set_size);
 | 
				
			||||||
 | 
						virtual ~File();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const std::string& Filename() const;
 | 
				
			||||||
 | 
						virtual unsigned long Size() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
						unsigned long size;
 | 
				
			||||||
 | 
						std::string filename;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										58
									
								
								2022/7/Folder.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								2022/7/Folder.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
				
			|||||||
 | 
					#include "Folder.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <algorithm>
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Folder::Folder(const std::string &filename)
 | 
				
			||||||
 | 
						: File(filename, 0)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsigned long Folder::Size() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unsigned long size = 0;
 | 
				
			||||||
 | 
						for(const auto *file : files)
 | 
				
			||||||
 | 
							size += file->Size();
 | 
				
			||||||
 | 
						return size;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Folder::AddFile(const std::string &filename,
 | 
				
			||||||
 | 
					                     unsigned long size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// make sure the file doesn't already exist:
 | 
				
			||||||
 | 
						if(std::find_if(files.begin(), files.end(),
 | 
				
			||||||
 | 
						                [&](const File *file) {
 | 
				
			||||||
 | 
							                return file->Filename() == filename;
 | 
				
			||||||
 | 
						                }) != files.end())
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							std::cerr << "Folder \"" << this->Filename() << "\" already contains "
 | 
				
			||||||
 | 
							          << "the file \"" << filename << "\"." << std::endl;
 | 
				
			||||||
 | 
							exit(-1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// increment this folder's size total:
 | 
				
			||||||
 | 
						this->size += size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// add the file:
 | 
				
			||||||
 | 
						files.push_back(new File(filename, size));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Folder::AddFolder(const std::string &name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if(std::find_if(files.begin(), files.end(),
 | 
				
			||||||
 | 
						                [&](const File *file) {
 | 
				
			||||||
 | 
							                return file->Filename() == name;
 | 
				
			||||||
 | 
						                }) != files.end())
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							std::cout << "NOTE: Folder \"" << this->Filename() << "\" already contains "
 | 
				
			||||||
 | 
							          << "the subfolder \"" << name << "\"." << std::endl;
 | 
				
			||||||
 | 
							// exit(-1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						files.push_back(new Folder(name));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const std::vector<File*>& Folder::Files() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return files;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										22
									
								
								2022/7/Folder.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								2022/7/Folder.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					#ifndef ADVENT_DVEREB_FOLDER_H
 | 
				
			||||||
 | 
					#define ADVENT_DVEREB_FOLDER_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "File.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					#include <vector>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Folder : public File {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
						Folder(const std::string &filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unsigned long Size() const override;
 | 
				
			||||||
 | 
						void AddFile(const std::string &filename, unsigned long size);
 | 
				
			||||||
 | 
						void AddFolder(const std::string &name);
 | 
				
			||||||
 | 
						const std::vector<File*>& Files() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
						std::vector<File*> files;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
../starter/Makefile
 | 
					 | 
				
			||||||
							
								
								
									
										2
									
								
								2022/7/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								2022/7/Makefile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					a.out: main.cpp File.h File.cpp Folder.h Folder.cpp SplitStr.h
 | 
				
			||||||
 | 
						clang++ -std=c++2b -g -O0 main.cpp File.cpp Folder.cpp
 | 
				
			||||||
							
								
								
									
										22
									
								
								2022/7/SplitStr.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								2022/7/SplitStr.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					#ifndef ADVENT_DVEREB_SPLITSTR_H
 | 
				
			||||||
 | 
					#define ADVENT_DVEREB_SPLITSTR_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <vector>
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::vector<std::string> SplitStr(std::string str, const std::string &delim)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::vector<std::string> rtn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(auto split = str.find(delim); split != std::string::npos; split = str.find(delim))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							rtn.push_back(str.substr(0, split));
 | 
				
			||||||
 | 
							str = str.substr(split + delim.size()); // chop off beginning
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if(str.size())
 | 
				
			||||||
 | 
							rtn.push_back(str);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return rtn;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										116
									
								
								2022/7/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										116
									
								
								2022/7/main.cpp
									
									
									
									
									
								
							@@ -1,112 +1,13 @@
 | 
				
			|||||||
 | 
					#include "Folder.h"
 | 
				
			||||||
 | 
					#include "SplitStr.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <algorithm>
 | 
					#include <algorithm>
 | 
				
			||||||
#include <fstream>
 | 
					#include <fstream>
 | 
				
			||||||
#include <iostream>
 | 
					#include <iostream>
 | 
				
			||||||
#include <set>
 | 
					 | 
				
			||||||
#include <stack>
 | 
					#include <stack>
 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
#include <vector>
 | 
					#include <vector>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
std::vector<std::string> SplitStr(std::string str, const std::string &delim)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	std::vector<std::string> rtn;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for(auto split = str.find(delim); split != std::string::npos; split = str.find(delim))
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		rtn.push_back(str.substr(0, split));
 | 
					 | 
				
			||||||
		str = str.substr(split + delim.size()); // chop off beginning
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if(str.size())
 | 
					 | 
				
			||||||
		rtn.push_back(str);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return rtn;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class File {
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
	File(const std::string &set_filename, unsigned long set_size)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			this->size = set_size;
 | 
					 | 
				
			||||||
			this->filename = set_filename;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	virtual ~File()
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	const std::string& Filename() const
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			return filename;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	virtual unsigned long Size() const
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			return size;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
protected:
 | 
					 | 
				
			||||||
	unsigned long size;
 | 
					 | 
				
			||||||
	std::string filename;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Folder : public File {
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
	Folder(const std::string &filename)
 | 
					 | 
				
			||||||
		: File(filename, 0)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	unsigned long Size() const override
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			unsigned long size = 0;
 | 
					 | 
				
			||||||
			for(const auto *file : files)
 | 
					 | 
				
			||||||
				size += file->Size();
 | 
					 | 
				
			||||||
			return size;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	void AddFile(const std::string &filename,
 | 
					 | 
				
			||||||
	             unsigned long size)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			// make sure the file doesn't already exist:
 | 
					 | 
				
			||||||
			if(std::find_if(files.begin(), files.end(),
 | 
					 | 
				
			||||||
			                [&](const File *file) {
 | 
					 | 
				
			||||||
				                return file->Filename() == filename;
 | 
					 | 
				
			||||||
			                }) != files.end())
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				std::cerr << "Folder \"" << this->Filename() << "\" already contains "
 | 
					 | 
				
			||||||
				          << "the file \"" << filename << "\"." << std::endl;
 | 
					 | 
				
			||||||
				exit(-1);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// increment this folder's size total:
 | 
					 | 
				
			||||||
			this->size += size;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// add the file:
 | 
					 | 
				
			||||||
			files.push_back(new File(filename, size));
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	void AddFolder(const std::string &name)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			if(std::find_if(files.begin(), files.end(),
 | 
					 | 
				
			||||||
			                [&](const File *file) {
 | 
					 | 
				
			||||||
				                return file->Filename() == name;
 | 
					 | 
				
			||||||
			                }) != files.end())
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				std::cout << "NOTE: Folder \"" << this->Filename() << "\" already contains "
 | 
					 | 
				
			||||||
				          << "the subfolder \"" << name << "\"." << std::endl;
 | 
					 | 
				
			||||||
				// exit(-1);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			files.push_back(new Folder(name));
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	const std::vector<File*>& Files() const
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			return files;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
	std::vector<File*> files;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void DebugOutput(File *file)
 | 
					void DebugOutput(File *file)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	static int indent = -1;
 | 
						static int indent = -1;
 | 
				
			||||||
@@ -169,16 +70,15 @@ void PartTwo(File *file, unsigned long at_least, File *&smallest)
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main()
 | 
					void Parse(Folder &root)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	std::ifstream ifs("data.txt");
 | 
						std::ifstream ifs("data.txt");
 | 
				
			||||||
	if(!ifs.is_open())
 | 
						if(!ifs.is_open())
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		std::cerr << "Missing data.txt." << std::endl;
 | 
							std::cerr << "Missing data.txt." << std::endl;
 | 
				
			||||||
		return -1;
 | 
							exit(-1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Folder root("/");
 | 
					 | 
				
			||||||
	std::stack<Folder*> dir_stack;
 | 
						std::stack<Folder*> dir_stack;
 | 
				
			||||||
	dir_stack.push(&root);
 | 
						dir_stack.push(&root);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -238,6 +138,12 @@ int main()
 | 
				
			|||||||
			dir_stack.top()->AddFile(values[1], std::atol(values[0].c_str()));
 | 
								dir_stack.top()->AddFile(values[1], std::atol(values[0].c_str()));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						Folder root("/");
 | 
				
			||||||
 | 
						Parse(root);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Step 1.5: Debug output:
 | 
						// Step 1.5: Debug output:
 | 
				
			||||||
	DebugOutput(&root);
 | 
						DebugOutput(&root);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user