diff --git a/.clangd b/.clangd index 24663fb..d839602 100644 --- a/.clangd +++ b/.clangd @@ -1,6 +1,5 @@ CompileFlags: Add: - - -std=c++26 - -Xclang - -fno-validate-pch - -fretain-comments-from-system-headers diff --git a/Makefile b/Makefile index 5c40d64..dfd2d4e 100644 --- a/Makefile +++ b/Makefile @@ -1,39 +1,24 @@ .RECIPEPREFIX = > .DEFAULT_GOAL = build/main.out CXX = clang++ -CXXFLAGS += -std=c++26 -Wno-experimental-header-units -Wno-unused-command-line-argument +CXXFLAGS += -std=c++26 -Wno-experimental-header-units LDFLAGS += -std=c++26 SYSTEMHEADER_FLAGS = -Wno-deprecated-builtins -Wno-pragma-system-header-outside-header -Wno-keyword-compat -module_pair = $(if $(findstring user,$1),$(patsubst build/user/%.pcm,%=,$1))$1 -build_module_path = $(if $1,$(let first rest,$1,$(if $(rest),-fmodule-file=$(call module_pair,$(first)) $(call build_module_path,$(rest)),-fmodule-file=$(call module_pair,$(first))))) -object_build = $(filter-out %.pcm,$^) $(call build_module_path,$(filter %.pcm,$^)) -autodir = @mkdir -p $(@D) +build_module_path = $(let first rest,$1,$(if $(rest),-fmodule-file=$(first) $(call build_module_path,$(rest)),-fmodule-file=$(first))) -build/main.out: build/main.o build/builder.o -> $(call autodir) +build/main.out: build/main.o > $(CXX) $(LDFLAGS) $^ -o $@ -build/main.o:: main.cxx build/system/print.pcm build/user/builder.pcm - -build/builder.o:: builder.cppm build/system/type_traits.pcm -build/user/builder.pcm:: build/system/type_traits.pcm - -build/%.o:: -> $(call autodir) -> $(CXX) $(CXXFLAGS) -c $(call object_build) +build/main.o: main.cxx build/print.pcm build/type_traits.pcm +> $(CXX) $(CXXFLAGS) -c $(filter-out %.pcm,$^) $(call build_module_path,$(filter %.pcm,$^)) > @mv $(patsubst build/%,%,$@) $@ -build/user/%.pcm:: %.cppm -> $(call autodir) -> $(CXX) $(CXXFLAGS) --precompile -o $@ $(call object_build) - -build/system/%.pcm: -> $(call autodir) -> $(CXX) $(CXXFLAGS) -xc++-system-header --precompile $(patsubst build/system/%.pcm,%,$@) -o $@ $(SYSTEMHEADER_FLAGS) +build/%.pcm: +> $(CXX) $(CXXFLAGS) -xc++-system-header --precompile $(patsubst build/%.pcm,%,$@) -o $@ $(SYSTEMHEADER_FLAGS) .PHONY: clean run clean: -> @-rm -rf ./build +> @-rm -rf ./build/* bear: clean > bear -- $(MAKE) diff --git a/builder.cppm b/builder.cppm deleted file mode 100644 index 7d91a94..0000000 --- a/builder.cppm +++ /dev/null @@ -1,56 +0,0 @@ -export module builder; -import ; - -export template -struct Builder; -template -struct BuildMixin {}; - -template <> -struct BuildMixin { - auto build(this auto&& self) - requires requires { self.p1 + self.p2; } - { - return self.p1 + self.p2; - } -}; - -template -struct Param1Mixin {}; - -template <> -struct Param1Mixin { - auto fill_param1(this auto&& self) - requires requires { self.p1; } - { - self.p1 = 1; - return Builder::param2_v>( - self); - } -}; - -template -struct Param2Mixin {}; - -template <> -struct Param2Mixin { - auto fill_param2(this auto&& self) - requires requires { self.p2; } - { - self.p2 = 1; - return Builder::param1_v, true>( - self); - } -}; - -template -struct Builder : BuildMixin, - Param1Mixin, - Param2Mixin { - const constinit static auto param1_v = param1; - const constinit static auto param2_v = param2; - int p1; - int p2; - Builder() : p1(0), p2(0) {} - Builder(auto&& other) : p1(other.p1), p2(other.p2) {} -}; diff --git a/main.cxx b/main.cxx index b87f7c4..358ccec 100644 --- a/main.cxx +++ b/main.cxx @@ -1,5 +1,51 @@ import ; -import builder; +import ; + +template +struct Builder; +template +struct BuildMixin {}; + +template <> +struct BuildMixin { + auto build(this auto&& self) { return self.p1 + self.p2; } +}; + +template +struct Param1Mixin {}; + +template <> +struct Param1Mixin { + auto fill_param1(this auto&& self) { + self.p1 = 1; + return Builder::param2_v>( + self); + } +}; + +template +struct Param2Mixin {}; + +template <> +struct Param2Mixin { + auto fill_param2(this auto&& self) { + self.p2 = 1; + return Builder::param1_v, true>( + self); + } +}; + +template +struct Builder : BuildMixin, + Param1Mixin, + Param2Mixin { + const constinit static auto param1_v = param1; + const constinit static auto param2_v = param2; + int p1; + int p2; + Builder() : p1(0), p2(0) {} + Builder(auto&& other) : p1(other.p1), p2(other.p2) {} +}; auto main() -> int { Builder builder;