From 331c4d014158c38c61cf3a86b637e3d65a2b4155 Mon Sep 17 00:00:00 2001 From: fl4shk Date: Sun, 6 Nov 2022 10:48:57 -0600 Subject: [PATCH] make it buildable --- .gitignore | 3 + GNUmakefile | 182 ++++++++++++++++++++++++++++++++++++++++++ example.png | Bin 0 -> 52758 bytes src/main.cpp | 115 ++++++++++++++++++++++++++ src/misc_includes.hpp | 2 +- src/rule_class.hpp | 19 ++--- 6 files changed, 311 insertions(+), 10 deletions(-) create mode 100644 GNUmakefile create mode 100644 example.png create mode 100644 src/main.cpp diff --git a/.gitignore b/.gitignore index d9ad707..45b112e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ *.o *.a *.d +*.P *.elf *.sav* *.ss* @@ -9,3 +10,5 @@ tags types_*.taghl *.ignore +wfc +wfc_debug diff --git a/GNUmakefile b/GNUmakefile new file mode 100644 index 0000000..0d699f4 --- /dev/null +++ b/GNUmakefile @@ -0,0 +1,182 @@ +# These directories specify where source code files are located. +# Edit these variables if more directories are needed. +# Separate each entry by spaces. + + +SHARED_SRC_DIRS:=src \ + +CXX_DIRS:=$(SHARED_SRC_DIRS) +# End of source directories + + +# Whether or not to do debugging stuff +#DEBUG:=yeah do debug + +DEBUG_OPTIMIZATION_LEVEL:=-Og +REGULAR_OPTIMIZATION_LEVEL:=-O2 + + +ALWAYS_DEBUG_SUFFIX:=_debug +ifdef DEBUG + DEBUG_SUFFIX:=$(ALWAYS_DEBUG_SUFFIX) +endif + +# This is the name of the output file. Change this if needed! +PROJ:=$(shell basename $(CURDIR))$(DEBUG_SUFFIX) + +# This is used for do_asmouts +#VERBOSE_ASM_FLAG:=-fverbose-asm + +# Compilers and initial compiler flags +CXX:=$(PREFIX)g++ +CXX_FLAGS:=$(CXX_FLAGS) -std=c++20 -fcoroutines -fmodules-ts -Wall + +ifdef DEBUG + CXX_FLAGS:=$(CXX_FLAGS) -DDEBUG=1 +endif +OBJDUMP:=$(PREFIX)objdump + + +LD:=$(CXX) + +# Initial linker flags +LD_FLAGS:=$(LD_FLAGS) -lm + + + +ifdef DEBUG + EXTRA_DEBUG_FLAGS:=-g + DEBUG_FLAGS:=-gdwarf-3 $(EXTRA_DEBUG_FLAGS) + EXTRA_LD_FLAGS:=$(DEBUG_FLAGS) + OPTIMIZATION_LEVEL:=$(DEBUG_OPTIMIZATION_LEVEL) +else + OPTIMIZATION_LEVEL:=$(REGULAR_OPTIMIZATION_LEVEL) +endif + + + + +FINAL_BASE_FLAGS:=$(OPTIMIZATION_LEVEL) \ + $(EXTRA_BASE_FLAGS) $(EXTRA_DEBUG_FLAGS) + +# Final compiler and linker flags +CXX_FLAGS:=$(CXX_FLAGS) $(FINAL_BASE_FLAGS) +LD_FLAGS:=$(LD_FLAGS) $(EXTRA_LD_FLAGS) $(COMMON_LD_FLAGS) + + + + +# Generated directories +OBJDIR:=objs$(DEBUG_SUFFIX) +ASMOUTDIR:=asmouts$(DEBUG_SUFFIX) +DEPDIR:=deps$(DEBUG_SUFFIX) + + + + +CXX_SOURCES := $(foreach DIR,$(CXX_DIRS),$(wildcard $(DIR)/*.cpp)) +CXX_OFILES := $(CXX_SOURCES:%.cpp=$(OBJDIR)/%.o) +CXX_PFILES := $(CXX_SOURCES:%.cpp=$(DEPDIR)/%.P) + +# Assembly source code generated by gcc/g++ +CXX_ASMOUTS := $(CXX_SOURCES:%.cpp=$(ASMOUTDIR)/%.s) + + + +# Compiler-generated files +# OFILES are object code files (extension .o) +OFILES:=$(CXX_OFILES) +# PFILES are used for automatic dependency generation +PFILES:=$(CXX_PFILES) +ASMOUTS:=$(CXX_ASMOUTS) + + +.PHONY : all +all : all_pre $(OFILES) + $(LD) $(OFILES) -o $(PROJ) $(LD_FLAGS) + + +# all_objs is ENTIRELY optional +.PHONY : all_objs +all_objs : all_pre $(OFILES) + @# + + +.PHONY : do_asmouts +do_asmouts : all_pre all_pre_asmout $(ASMOUTS) + @# + + +.PHONY : all_pre +all_pre : + mkdir -p $(OBJDIR) $(DEPDIR) + @for ofile in $(OFILES); \ + do \ + mkdir -p $$(dirname $$ofile); \ + done + @for pfile in $(PFILES); \ + do \ + mkdir -p $$(dirname $$pfile); \ + done + + + +.PHONY : all_pre_asmout +all_pre_asmout : + mkdir -p $(ASMOUTDIR) + @for asmout in $(ASMOUTS); \ + do \ + mkdir -p $$(dirname $$asmout); \ + done + + +# Here's where things get really messy. +$(CXX_OFILES) : $(OBJDIR)/%.o : %.cpp + @echo $@" was updated or has no object file. (Re)Compiling...." + $(CXX) $(CXX_FLAGS) -MMD -c $< -o $@ + @cp $(OBJDIR)/$*.d $(DEPDIR)/$*.P + @rm -f $(OBJDIR)/$*.d + + + +# Here we have stuff for outputting assembly source code instead of an object file. +$(CXX_ASMOUTS) : $(ASMOUTDIR)/%.s : %.cpp + $(CXX) $(CXX_FLAGS) -MMD -S $(VERBOSE_ASM_FLAG) $< -o $@ + @cp $(ASMOUTDIR)/$*.d $(DEPDIR)/$*.P + @rm -f $(ASMOUTDIR)/$*.d + + + +-include $(PFILES) + +#¯\(°_o)/¯ + + +.PHONY : clean +clean : + rm -rfv $(OBJDIR) $(DEPDIR) $(ASMOUTDIR) $(PREPROCDIR) $(PROJ) tags *.taghl gmon.out + + +# Flags for make disassemble* +DISASSEMBLE_FLAGS:=$(DISASSEMBLE_BASE_FLAGS) -C -d +DISASSEMBLE_ALL_FLAGS:=$(DISASSEMBLE_BASE_FLAGS) -C -D + +DISASSEMBLE_2_FLAGS:=$(DISASSEMBLE_BASE_FLAGS) -C -S -l -d +DISASSEMBLE_ALL_2_FLAGS:=$(DISASSEMBLE_BASE_FLAGS) -C -S -l -D + +.PHONY : disassemble +disassemble : + $(OBJDUMP) $(DISASSEMBLE_FLAGS) $(PROJ) + +.PHONY : disassemble_all +disassemble_all : + $(OBJDUMP) $(DISASSEMBLE_ALL_FLAGS) $(PROJ) + + +.PHONY : disassemble_2 +disassemble_2 : + $(OBJDUMP) $(DISASSEMBLE_2_FLAGS) $(PROJ) + +.PHONY : disassemble_all_2 +disassemble_all_2 : + $(OBJDUMP) $(DISASSEMBLE_ALL_2_FLAGS) $(PROJ) diff --git a/example.png b/example.png new file mode 100644 index 0000000000000000000000000000000000000000..eeb284dd3ba72a2a811eff739d19f9199e875c76 GIT binary patch literal 52758 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 size_2d; + + if (argc < 4 || argc > 5) { + printerr("Usage 1: ", argv[0], " input_tiles_file width height\n"); + printerr("Usage 2: ", argv[0], + " input_tiles_file width height rng_seed\n"); + exit(1); + } + //ArgParser ap; + //ap.add("--ifile", "-i", HasArg::Req); + //ap.add("--width", "-w", HasArg::Req); + //ap.add("--height", "-h", HasArg::Req); + //ap.parse(argc, argv); + + std::vector> input_tiles; + if ( + std::fstream file(argv[1], std::ios_base::in); + file.is_open() + ) { + while (!file.eof()) { + std::string line; + std::getline(file, line); + if (file.eof() && line.size() == 0) { + } else if ( + input_tiles.size() > 0 + && input_tiles.back().size() != line.size() + ) { + printerr + ("Input tiles file \"", argv[1], "\" has ", + "difference in line sizes ", + "(found first instance at line numbers ", + "[", input_tiles.size(), ", ", + (input_tiles.size() + size_t(1)), "])" + "\n"); + exit(1); + } else if (line.size() == 0) { + printerr("Input tiles file \"", argv[1], "\" has line ", + "of size 0 ", + "(found first instance at line number ", + input_tiles.size(), ")", + "\n"); + exit(1); + } else { + //input_tiles.push_back(std::move(line)); + std::vector darr; + for (const auto& c: line) { + darr.push_back(static_cast(c)); + } + input_tiles.push_back(std::move(darr)); + } + } + } else { + printerr("Couldn't open input tiles file \"", argv[1], "\" for ", + "reading.\n"); + exit(1); + } + //printout("Read in this these `input_tiles`\n"); + //for (size_t j=0; j 32) { + if (i == size_2d.IND_X) { + printerr("`width` (", size_2d.at(i), ") must be in the ", + "range [1, 32]\n"); + } else if (i == size_2d.IND_Y) { + printerr("`height` (", size_2d.at(i), ") must be in the ", + "range [1, 32]\n"); + } + exit(1); + } + } + + u64 seed; + + if (argc == 4) { + seed = get_hrc_now_rng_seed(); + } else { // if (argc == 5) + inv_sconcat(std::string(argv[4]), seed); + } + + wfc::Wfc the_wfc(size_2d, seed, input_tiles); + for (size_t j=0; jfirst)); + //printout(uset.begin()->first); + printout(static_cast(*uset.begin())); + //for (const auto& item: umap) { + // if (item.second) { + // printout(item.first); + // break; + // } + //} + } + printout("\n"); + } + + return 0; +} diff --git a/src/misc_includes.hpp b/src/misc_includes.hpp index ffbd566..6377245 100644 --- a/src/misc_includes.hpp +++ b/src/misc_includes.hpp @@ -23,7 +23,7 @@ #include "liborangepower_src/concepts/is_specialization_concepts.hpp" #include "liborangepower_src/math/vec2_classes.hpp" #include "liborangepower_src/math/shape_2d_classes.hpp" -//#include "liborangepower_src/time/time_stuff.hpp" +#include "liborangepower_src/time/time_stuff.hpp" //#include "liborangepower_src/arg_parser_class.hpp" using namespace liborangepower::misc_output; diff --git a/src/rule_class.hpp b/src/rule_class.hpp index 9ddf4c6..6f0aa44 100644 --- a/src/rule_class.hpp +++ b/src/rule_class.hpp @@ -36,17 +36,18 @@ constexpr inline std::ostream& operator << ( switch (d) { //-------- case Dir::Left: - return osprintout(os, "Dir::Left"); + os << "Dir::Left"; case Dir::Top: - return osprintout(os, "Dir::Top"); + os << "Dir::Top"; case Dir::Right: - return osprintout(os, "Dir::Right"); + os << "Dir::Right"; case Dir::Bottom: - return osprintout(os, "Dir::Bottom"); + os << "Dir::Bottom"; default: - return osprintout(os, "Dir::Bad"); + os << "Dir::Bad"; //-------- } + return os; } class Rule final { @@ -66,13 +67,13 @@ class Rule final { } }; using RuleUset = std::unordered_set; -constexpr inline std::ostream& operator << ( +inline std::ostream& operator << ( std::ostream& os, const Rule& rule ) { os - << "{" << "\'" << rule.t0 << "\' << " - << "\'" << rule.t1 << "\' << " - << rule.d << "}"; + << "{" << "\'" << rule.t0 << "\', " + << "\'" << rule.t1 << "\', " + << rule.d << "}"; return os; } //--------