diff --git a/src/dom/protobuf/protobuf_plugin.cpp b/src/dom/protobuf/protobuf_plugin.cpp index 73ece7b..14b48ca 100644 --- a/src/dom/protobuf/protobuf_plugin.cpp +++ b/src/dom/protobuf/protobuf_plugin.cpp @@ -2,14 +2,7 @@ // #include "dom/protobuf/protobuf_plugin.h" -#include "doim/generic/attribute.h" -#include "doim/set.hpp" #include "err/err.h" -#include -#include -#include -#include -#include namespace dom { diff --git a/src/dom/protobuf/protobuf_plugin.h b/src/dom/protobuf/protobuf_plugin.h index 095a22c..c38327c 100644 --- a/src/dom/protobuf/protobuf_plugin.h +++ b/src/dom/protobuf/protobuf_plugin.h @@ -3,23 +3,9 @@ #pragma once -#include "dom/cxx/cxx_files_mixin.hpp" -#include "dom/cxx/cxx_headers_mixin.hpp" -#include "dom/cxx/protobufs_mixin.hpp" #include "dom/element.hpp" -#include "doim/cxx/cxx_header.h" -#include "doim/cxx/cxx_include_directory.h" -#include "doim/fs/fs_directory.h" #include "doim/fs/fs_file.h" -#include "doim/generic/attribute.h" -#include "doim/generic/attribute_name.h" -#include "doim/generic/attribute_value.h" -#include "dp/handle.hpp" -#include "dp/map_container.hpp" -#include "dp/memoization.hpp" -#include "dp/solitary_container.hpp" #include "err/err.h" -#include #include #include diff --git a/src/parser/dbs/dbs_parser.cpp b/src/parser/dbs/dbs_parser.cpp index 507d5de..22e3554 100644 --- a/src/parser/dbs/dbs_parser.cpp +++ b/src/parser/dbs/dbs_parser.cpp @@ -35,21 +35,21 @@ static auto r_illegal = r_any("/?<>\\:;*|\""); static auto r_pathChars = r_any() - r_illegal - r_space - r_endl; static auto r_path = ~r_slash & +r_pathChars & *(r_slash & +r_pathChars) & ~r_slash; -static auto r_annexKeyword = r_str("annex"); +static auto r_annexKw = r_str("annex"); static auto r_at = r_char('@'); static auto r_equal = r_char('='); -static auto r_protobufPluginKeyword = r_str("protobuf_plugin"); +static auto r_protobufPluginKw = r_str("protobuf_plugin"); -static auto r_cxxProgramKeyword = r_str("cxx_program"); +static auto r_cxxProgramKw = r_str("cxx_program"); -static auto r_cxxLibraryKeyword = r_str("cxx_library"); -static auto r_cxxFileKeyword = r_str("cxx_file"); -static auto r_protobufFileKeyword = r_str("protobuf_file"); +static auto r_cxxLibraryKw = r_str("cxx_library"); +static auto r_cxxFileKw = r_str("cxx_file"); +static auto r_protobufFileKw = r_str("protobuf_file"); -static auto r_cxxHeaderKeyword = r_str("cxx_header"); -static auto r_binaryKeyword = r_str("binary"); +static auto r_cxxHeaderKw = r_str("cxx_header"); +static auto r_binaryKw = r_str("binary"); typedef const string::const_iterator I; @@ -69,15 +69,16 @@ struct Attribute { auto name() { - return - [this](I& i1, I& i2) { mName = doim::AttributeName::unique(string(i1, i2)); }; + return e_ref([this](I& i1, I& i2) { + mName = doim::AttributeName::unique(string(i1, i2)); + }); } auto value() { - return [this](I& i1, I& i2) { + return e_ref([this](I& i1, I& i2) { mValue = doim::AttributeValue::unique(string(i1, i2)); - }; + }); } void operator()(I& i1, I& i2) @@ -99,7 +100,7 @@ struct Directory auto reset() { - return [this](I& i1, I& i2) { mDirectory = mDefaultDirectory; }; + return e_ref([this](I& i1, I& i2) { mDirectory = mDefaultDirectory; }); } doim::FsDirectorySPtr mDirectory; @@ -132,7 +133,7 @@ struct FileSet auto reset() { - return [this](I& i1, I& i2) { mFiles.clear(); }; + return e_ref([this](I& i1, I& i2) { mFiles.clear(); }); } void operator()(I& i1, I& i2) @@ -153,12 +154,14 @@ struct Object auto cxxLibrary() { - return [this](I& i1, I& i2) { mObjType = doim::Object::EType::kCxxLibrary; }; + return e_ref( + [this](I& i1, I& i2) { mObjType = doim::Object::EType::kCxxLibrary; }); } auto cxxProgram() { - return [this](I& i1, I& i2) { mObjType = doim::Object::EType::kCxxProgram; }; + return e_ref( + [this](I& i1, I& i2) { mObjType = doim::Object::EType::kCxxProgram; }); } void operator()(I& i1, I& i2) @@ -221,7 +224,7 @@ struct CxxLibrarySet auto reset() { - return [this](I& i1, I& i2) { mCxxLibraries.clear(); }; + return e_ref([this](I& i1, I& i2) { mCxxLibraries.clear(); }); } void operator()(I& i1, I& i2) @@ -235,21 +238,32 @@ struct CxxLibrarySet struct CxxLibrary { - CxxLibrary(Attribute& attribute, Directory& directory, FileSet& files) + CxxLibrary(Attribute& attribute, + Directory& directory, + File& file, + FileSet& files, + CxxLibrarySet& cxxLibraries, + CxxLibraryRef& cxxLibraryRef) : mAttribute(attribute) , mDirectory(directory) + , mFile(file) , mFiles(files) + , mCxxLibraries(cxxLibraries) + , mCxxLibraryRef(cxxLibraryRef) { } auto resetHeader() { - return [this](I& i1, I& i2) { mVisibility.reset(); }; + return e_ref([this](I& i1, I& i2) { + mVisibility.reset(); + mDirectory.reset(); + }); } auto attribute() { - return [this](I& i1, I& i2) { + return e_ref([this](I& i1, I& i2) { if (mAttribute.mName == dom::CxxLibrary::gVisibility) { mVisibility = mAttribute.mAttribute; @@ -260,7 +274,7 @@ struct CxxLibrary doim::FsDirectory::obtain(mDirectory.mDefaultDirectory, mAttribute.mValue->value()); } - }; + }); } static doim::CxxHeader::EVisibility visibility(const doim::AttributeSPtr& attribute) @@ -272,32 +286,105 @@ struct CxxLibrary if (attribute->value() == dom::CxxLibrary::gProtected) return doim::CxxHeader::EVisibility::kProtected; ASSERT(false); + return doim::CxxHeader::EVisibility::kProtected; } auto cxxHeaders() { - return [this](I& i1, I& i2) { + return e_ref([this](I& i1, I& i2) { mCxxLibrary->updateCxxHeaders(visibility(mVisibility), mDirectory.mDirectory, mFiles.mFiles); - }; + }); } + auto protobufs() { - return [this](I& i1, I& i2) { + return e_ref([this](I& i1, I& i2) { mCxxLibrary->updateProtobufsList(visibility(mVisibility), mDirectory.mDirectory, mFiles.mFiles); - }; + }); + } + + auto libraries() + { + return e_ref([this](I& i1, I& i2) { + mCxxLibrary->updateCxxLibraries(mCxxLibraries.mCxxLibraries); + }); + } + + auto files() + { + return e_ref( + [this](I& i1, I& i2) { mCxxLibrary->updateCxxFilesList(mFiles.mFiles); }); + } + + auto binary() + { + return e_ref([this](I& i1, I& i2) { mCxxLibrary->updateBinary(mFile.mFile); }); + } + + auto name() + { + return e_ref([this](I& i1, I& i2) { mCxxLibrary = mCxxLibraryRef.mCxxLibrary; }); + } + + auto updateAttribute() + { + return e_ref([this](I& i1, I& i2) { + mCxxLibrary->updateAttribute(mAttribute.mAttribute); + }); } Attribute& mAttribute; - doim::AttributeSPtr mVisibility; Directory& mDirectory; + File& mFile; FileSet& mFiles; + CxxLibrarySet& mCxxLibraries; + CxxLibraryRef& mCxxLibraryRef; + + doim::AttributeSPtr mVisibility; dom::CxxLibrarySPtr mCxxLibrary; }; +struct CxxProgram +{ + CxxProgram(Object& object, FileSet& files, CxxLibrarySet& cxxLibraries) + : mObject(object) + , mFiles(files) + , mCxxLibraries(cxxLibraries) + { + } + + auto libraries() + { + return e_ref([this](I& i1, I& i2) { + mCxxProgram->updateCxxLibraries(mCxxLibraries.mCxxLibraries); + }); + } + + auto files() + { + return e_ref( + [this](I& i1, I& i2) { mCxxProgram->updateCxxFilesList(mFiles.mFiles); }); + } + + auto name() + { + return e_ref([this](I& i1, I& i2) { + mCxxProgram = dom::CxxProgram::obtain(mObject.mObject); + mCxxProgram->updateName(mObject.mObject->name()); + }); + } + + Object& mObject; + FileSet& mFiles; + CxxLibrarySet& mCxxLibraries; + + dom::CxxProgramSPtr mCxxProgram; +}; + ECode DbsParser::parse(const doim::FsFileSPtr& dbsFile) { // DLOG("Parse dbs file: {}", dbsFile->path()); @@ -316,15 +403,15 @@ ECode DbsParser::parse(const doim::FsFileSPtr& dbsFile) // Attribute Attribute attribute; - auto r_attributeName = *r_ws & r_ident() >> e_ref(attribute.name()); - auto r_attributeValue = *r_ws & (r_ident() | r_path) >> e_ref(attribute.value()); + auto r_attributeName = *r_ws & r_ident() >> attribute.name(); + auto r_attributeValue = *r_ws & (r_ident() | r_path) >> attribute.value(); auto r_attribute = (*r_ws & r_at & r_attributeName & *r_ws & r_equal & r_attributeValue) >> e_ref(attribute); // Directory Directory directory(location); - auto r_setLocation = r_empty() >> e_ref(directory.reset()); + auto r_resetDir = r_empty() >> directory.reset(); // File File file(directory); @@ -332,18 +419,18 @@ ECode DbsParser::parse(const doim::FsFileSPtr& dbsFile) // Files FileSet files(file); - auto r_files = (r_empty() >> e_ref(files.reset())) & *(r_file >> e_ref(files)); + auto r_files = r_empty() >> files.reset() & *(r_file >> e_ref(files)); // Object Object object(location); auto r_object = *r_ws & r_path >> e_ref(object); - auto r_objectCxxLibrary = r_empty() >> e_ref(object.cxxLibrary()) & r_object; - auto r_objectCxxProgram = r_empty() >> e_ref(object.cxxProgram()) & r_object; + auto r_objectCxxLibrary = r_empty() >> object.cxxLibrary() & r_object; + auto r_objectCxxProgram = r_empty() >> object.cxxProgram() & r_object; // Annex Annex annex(errors, file); auto r_annex = - *r_ws & r_annexKeyword & r_he & r_setLocation & *(r_file >> e_ref(annex)) & r_se; + *r_ws & r_annexKw & r_he & r_resetDir & *(r_file >> e_ref(annex)) & r_se; // CxxLibrary Ref CxxLibraryRef cxxLibraryRef(object); @@ -352,97 +439,56 @@ ECode DbsParser::parse(const doim::FsFileSPtr& dbsFile) // CxxLibraries CxxLibrarySet cxxLibraries(cxxLibraryRef); auto r_cxxLibraryItem = r_cxxLibraryRef >> e_ref(cxxLibraries); - auto r_cxxLibrariesCat = - *r_ws & r_cxxLibraryKeyword >> e_ref(cxxLibraries.reset()) & r_he; - auto r_cxxLibraries = r_cxxLibrariesCat & *r_cxxLibraryItem & r_se; + auto r_cxxLibraries = + *r_ws & r_cxxLibraryKw >> cxxLibraries.reset() & r_he & *r_cxxLibraryItem & r_se; // CxxLibrary - CxxLibrary cxxLibrary(attribute, directory, files); - auto r_cxxHeaderAttribute = r_attribute >> e_ref(cxxLibrary.attribute()); - auto r_cxxHeaderCat = - *r_ws & (r_cxxHeaderKeyword >> e_ref(cxxLibrary.resetHeader())) & - (r_empty() >> e_ref(directory.reset())) & *r_cxxHeaderAttribute & r_he; - auto r_cxxHeader = - (r_cxxHeaderCat & r_files & r_se) >> e_ref(cxxLibrary.cxxHeaders()); + CxxLibrary cxxLibrary(attribute, directory, file, files, cxxLibraries, cxxLibraryRef); + auto r_cxxHeaderAttribute = r_attribute >> cxxLibrary.attribute(); + + // CxxHeaders + auto r_cxxHeader = (*r_ws & r_cxxHeaderKw >> cxxLibrary.resetHeader() & + *r_cxxHeaderAttribute & r_he & r_files & r_se) >> + cxxLibrary.cxxHeaders(); // CxxFiles - auto r_cxxFiles = *r_ws & r_cxxFileKeyword & r_he & r_setLocation & r_files & r_se; + auto r_cxxFiles = *r_ws & r_cxxFileKw & r_he & r_resetDir & r_files & r_se; + auto r_cxxLibraryCxxFile = r_cxxFiles >> cxxLibrary.files(); // CxxLibrary CxxLibrary - auto cxxLibraryX2Fn = [&cxxLibrary, &cxxLibraries](I& i1, I& i2) { - cxxLibrary.mCxxLibrary->updateCxxLibraries(cxxLibraries.mCxxLibraries); - }; - auto r_cxxLibraryX2 = r_cxxLibraries >> e_ref(cxxLibraryX2Fn); - - // CxxLibrary CxxFile - auto cxxLibraryCxxFileFn = [&cxxLibrary, &files](I& i1, I& i2) { - cxxLibrary.mCxxLibrary->updateCxxFilesList(files.mFiles); - }; - auto r_cxxLibraryCxxFile = r_cxxFiles >> e_ref(cxxLibraryCxxFileFn); + auto r_cxxLibraryX2 = r_cxxLibraries >> cxxLibrary.libraries(); // CxxLibrary ProtobufFile - - auto r_cxxLibraryProtobufFileCat = - *r_ws & (r_protobufFileKeyword >> e_ref(cxxLibrary.resetHeader())) & - (r_empty() >> e_ref(directory.reset())) & *r_cxxHeaderAttribute & r_he; - - auto r_cxxLibraryProtobufFile = - r_cxxLibraryProtobufFileCat & r_files >> e_ref(cxxLibrary.protobufs()) & r_se; - ; + auto r_cxxLibraryProtobufFile = *r_ws & r_protobufFileKw >> cxxLibrary.resetHeader() & + *r_cxxHeaderAttribute & r_he & + r_files >> cxxLibrary.protobufs() & r_se; // CxxLibrary CxxBinary - auto cxxBinaryFn = [&file, &cxxLibrary](I& i1, I& i2) { - cxxLibrary.mCxxLibrary->updateBinary(file.mFile); - }; - auto r_binary = *r_ws & r_binaryKeyword & r_he & r_setLocation & - (r_file >> e_ref(cxxBinaryFn)) & r_se; + auto r_binary = + *r_ws & r_binaryKw & r_he & r_resetDir & r_file >> cxxLibrary.binary() & r_se; // ... CxxLibrary - auto cxxLibraryNameFn = [&cxxLibraryRef, &cxxLibrary](I& i1, I& i2) { - cxxLibrary.mCxxLibrary = cxxLibraryRef.mCxxLibrary; - }; - auto r_cxxLibraryName = r_cxxLibraryRef >> e_ref(cxxLibraryNameFn); - - auto cxxLibraryAttributeFn = [&attribute, &cxxLibrary](I& i1, I& i2) { - cxxLibrary.mCxxLibrary->updateAttribute(attribute.mAttribute); - }; - - auto r_cxxLibraryAttribute = r_attribute >> e_ref(cxxLibraryAttributeFn); - - auto r_cxxLibraryCap = - *r_ws & r_cxxLibraryKeyword & r_cxxLibraryName & *r_cxxLibraryAttribute & r_he; - - auto r_cxxLibrary = r_cxxLibraryCap & + auto r_cxxLibraryName = r_cxxLibraryRef >> cxxLibrary.name(); + auto r_cxxLibraryAttribute = r_attribute >> cxxLibrary.updateAttribute(); + auto r_cxxLibrary = *r_ws & r_cxxLibraryKw & r_cxxLibraryName & + *r_cxxLibraryAttribute & r_he & *(r_cxxLibraryCxxFile | r_cxxLibraryProtobufFile | r_cxxHeader | r_cxxLibraryX2 | r_binary) & r_se; // CxxProgram - dom::CxxProgramSPtr cxxProgram; + CxxProgram cxxProgram(object, files, cxxLibraries); // CxxProgram CxxLibrary - auto cxxProgramCxxLibraryFn = [&cxxProgram, &cxxLibraries](I& i1, I& i2) { - cxxProgram->updateCxxLibraries(cxxLibraries.mCxxLibraries); - }; - auto r_cxxProgramCxxLibrary = r_cxxLibraries >> e_ref(cxxProgramCxxLibraryFn); + auto r_cxxProgramCxxLibrary = r_cxxLibraries >> cxxProgram.libraries(); // CxxProgram CxxFile - auto cxxProgramCxxFileFn = [&cxxProgram, &files](I& i1, I& i2) { - cxxProgram->updateCxxFilesList(files.mFiles); - }; - auto r_cxxProgramCxxFile = r_cxxFiles >> e_ref(cxxProgramCxxFileFn); + auto r_cxxProgramCxxFile = r_cxxFiles >> cxxProgram.files(); // ... CxxProgram - auto cxxProgramNameFn = [&object, &cxxProgram](I& i1, I& i2) { - cxxProgram = dom::CxxProgram::obtain(object.mObject); - cxxProgram->updateName(object.mObject->name()); - }; - auto r_cxxProgramName = r_objectCxxProgram >> e_ref(cxxProgramNameFn); - - auto r_cxxProgramCap = *r_ws & r_cxxProgramKeyword & r_cxxProgramName & r_he; - - auto r_cxxProgram = - r_cxxProgramCap & *(r_cxxProgramCxxFile | r_cxxProgramCxxLibrary) & r_se; + auto r_cxxProgramName = r_objectCxxProgram >> cxxProgram.name(); + auto r_cxxProgram = *r_ws & r_cxxProgramKw & r_cxxProgramName & r_he & + *(r_cxxProgramCxxFile | r_cxxProgramCxxLibrary) & r_se; const auto& r_dbs = ~r_annex & *(r_cxxLibrary | r_cxxProgram) & *r_ws & r_end(); diff --git a/src/rpc/server/server.cpp b/src/rpc/server/server.cpp index b874ccc..160bdf5 100644 --- a/src/rpc/server/server.cpp +++ b/src/rpc/server/server.cpp @@ -2,11 +2,6 @@ // #include "rpc/server/server.h" -#include -#include -#include -#include -#include namespace rpc {