Skip to content

Commit

Permalink
Release v3.0
Browse files Browse the repository at this point in the history
  • Loading branch information
arobenko committed Oct 19, 2019
2 parents 9bd72ff + 07bff92 commit e1cf1ab
Show file tree
Hide file tree
Showing 62 changed files with 2,121 additions and 27 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ endwhile ()
include(GNUInstallDirs)

if ("${CC_TAG}" STREQUAL "")
set (CC_TAG "v2.1")
set (CC_TAG "v2.2")
endif()

add_subdirectory(lib)
Expand Down
27 changes: 26 additions & 1 deletion app/commsdsl2comms/src/BitfieldField.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,31 @@ std::string BitfieldField::getCommonPreDefinitionImpl(const std::string& scope)
return common::processTemplate(Templ, repl);
}

bool BitfieldField::verifyAliasImpl(const std::string& fieldName) const
{
assert(!fieldName.empty());
auto dotPos = fieldName.find('.');
std::string firstFieldName(fieldName, 0, dotPos);
auto iter =
std::find_if(
m_members.begin(), m_members.end(),
[&firstFieldName](auto& f)
{
return firstFieldName == f->name();
});

if (iter == m_members.end()) {
return false;
}

if (dotPos == std::string::npos) {
return true;
}

std::string restFieldName(fieldName, dotPos + 1);
return (*iter)->verifyAlias(restFieldName);
}

std::string BitfieldField::getFieldBaseParams() const
{
auto obj = bitfieldFieldDslObj();
Expand Down Expand Up @@ -334,7 +359,7 @@ std::string BitfieldField::getAccess() const
"/// related to @b comms::field::Bitfield class from COMMS library\n"
"/// for details.\n"
"///\n"
"/// The generated access functions are:\n"
"/// The generated access functions are:\n"
"#^#ACCESS_DOC#$#\n"
"COMMS_FIELD_MEMBERS_ACCESS(\n"
" #^#NAMES#$#\n"
Expand Down
1 change: 1 addition & 0 deletions app/commsdsl2comms/src/BitfieldField.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ class BitfieldField : public Field
virtual void setForcedNoOptionsConfigImpl() override final;
virtual bool isVersionDependentImpl() const override final;
virtual std::string getCommonPreDefinitionImpl(const std::string& scope) const override final;
virtual bool verifyAliasImpl(const std::string& fieldName) const override final;

private:
using StringsList = common::StringsList;
Expand Down
110 changes: 110 additions & 0 deletions app/commsdsl2comms/src/BundleField.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ const std::string ClassTemplate(
" >;\n"
"public:\n"
" #^#ACCESS#$#\n"
" #^#ALIASES#$#\n"
" #^#PUBLIC#$#\n"
" #^#NAME#$#\n"
" #^#READ#$#\n"
Expand Down Expand Up @@ -240,6 +241,7 @@ std::string BundleField::getClassDefinitionImpl(
replacements.insert(std::make_pair("REFRESH", getRefresh()));
replacements.insert(std::make_pair("MEMBERS_STRUCT_DEF", getMembersDef(scope)));
replacements.insert(std::make_pair("ACCESS", getAccess()));
replacements.insert(std::make_pair("ALIASES", getAliases()));
replacements.insert(std::make_pair("PRIVATE", getPrivate()));
replacements.insert(std::make_pair("PUBLIC", getExtraPublic()));
replacements.insert(std::make_pair("PROTECTED", getFullProtected()));
Expand Down Expand Up @@ -368,6 +370,31 @@ std::string BundleField::getCommonPreDefinitionImpl(const std::string& scope) co
return common::processTemplate(Templ, repl);
}

bool BundleField::verifyAliasImpl(const std::string& fieldName) const
{
assert(!fieldName.empty());
auto dotPos = fieldName.find('.');
std::string firstFieldName(fieldName, 0, dotPos);
auto iter =
std::find_if(
m_members.begin(), m_members.end(),
[&firstFieldName](auto& f)
{
return firstFieldName == f->name();
});

if (iter == m_members.end()) {
return false;
}

if (dotPos == std::string::npos) {
return true;
}

std::string restFieldName(fieldName, dotPos + 1);
return (*iter)->verifyAlias(restFieldName);
}

std::string BundleField::getFieldOpts(const std::string& scope) const
{
StringsList options;
Expand Down Expand Up @@ -472,6 +499,89 @@ std::string BundleField::getAccess() const
return common::processTemplate(Templ, replacements);
}

std::string BundleField::getAliases() const
{
auto obj = bundleFieldDslObj();
auto aliases = obj.aliases();
if (aliases.empty()) {
return common::emptyString();
}

common::StringsList result;
for (auto& a : aliases) {
auto& fieldName = a.fieldName();
assert(!fieldName.empty());

auto dotPos = fieldName.find('.');
std::string firstFieldName(fieldName, 0, dotPos);
auto iter =
std::find_if(
m_members.begin(), m_members.end(),
[&firstFieldName](auto& f)
{
return firstFieldName == f->name();
});

if (iter == m_members.end()) {
continue;
}

std::string restFieldName;
if (dotPos != std::string::npos) {
restFieldName.assign(fieldName, dotPos + 1, fieldName.size());
}

if (!restFieldName.empty() && (!(*iter)->verifyAlias(restFieldName))) {
continue;
}

static const std::string Templ =
"/// @brief Alias to a member field.\n"
"/// @details\n"
"#^#ALIAS_DESC#$#\n"
"/// Generates field access alias function(s):\n"
"/// @b field_#^#ALIAS_NAME#$#() -> <b>#^#ALIASED_FIELD_DOC#$#</b>\n"
"COMMS_FIELD_ALIAS(#^#ALIAS_NAME#$#, #^#ALIASED_FIELD#$#);\n";

std::vector<std::string> aliasedFields;
ba::split(aliasedFields, fieldName, ba::is_any_of("."));
std::string aliasedFieldDocStr;
std::string aliasedFieldStr;
for (auto& f : aliasedFields) {
common::nameToAccess(f);

if (!aliasedFieldDocStr.empty()) {
aliasedFieldDocStr += '.';
}
aliasedFieldDocStr += "field_" + f + "()";

if (!aliasedFieldStr.empty()) {
aliasedFieldStr += ", ";
}

aliasedFieldStr += f;
}

auto desc = common::makeDoxygenMultilineCopy(a.description());
if (!desc.empty()) {
desc = common::doxygenPrefixStr() + common::indentStr() + desc + " @n";
}

common::ReplacementMap repl;
repl.insert(std::make_pair("ALIAS_NAME", common::nameToAccessCopy(a.name())));
repl.insert(std::make_pair("ALIASED_FIELD_DOC", std::move(aliasedFieldDocStr)));
repl.insert(std::make_pair("ALIASED_FIELD", std::move(aliasedFieldStr)));
repl.insert(std::make_pair("ALIAS_DESC", std::move(desc)));
result.push_back(common::processTemplate(Templ, repl));
}

if (result.empty()) {
return common::emptyString();
}

return common::listToString(result, "\n", common::emptyString());
}

std::string BundleField::getRead() const
{
auto customRead = getCustomRead();
Expand Down
2 changes: 2 additions & 0 deletions app/commsdsl2comms/src/BundleField.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ class BundleField : public Field
virtual void setForcedNoOptionsConfigImpl() override final;
virtual bool isVersionDependentImpl() const override final;
virtual std::string getCommonPreDefinitionImpl(const std::string& scope) const override final;
virtual bool verifyAliasImpl(const std::string& fieldName) const override final;

private:
using StringsList = common::StringsList;
Expand All @@ -62,6 +63,7 @@ class BundleField : public Field
std::string getFieldOpts(const std::string& scope) const;
std::string getMembersDef(const std::string& scope) const;
std::string getAccess() const;
std::string getAliases() const;
std::string getRead() const;
std::string getRefresh() const;
std::string getPrivate() const;
Expand Down
15 changes: 15 additions & 0 deletions app/commsdsl2comms/src/Field.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -768,6 +768,15 @@ std::string Field::getPluginAnonNamespace(
return common::processTemplate(Templ, replacements);
}

bool Field::verifyAlias(const std::string& fieldName) const
{
if (fieldName.empty()) {
return true;
}

return verifyAliasImpl(fieldName);
}

bool Field::prepareImpl()
{
return true;
Expand Down Expand Up @@ -1031,6 +1040,12 @@ std::string Field::getCommonPreDefinitionImpl(const std::string& scope) const
return common::emptyString();
}

bool Field::verifyAliasImpl(const std::string& fieldName) const
{
static_cast<void>(fieldName);
return false;
}

std::string Field::getNameFunc() const
{
auto customName = m_generator.getCustomNameForField(m_externalRef);
Expand Down
3 changes: 3 additions & 0 deletions app/commsdsl2comms/src/Field.h
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,8 @@ class Field
return m_dslObj;
}

bool verifyAlias(const std::string& fieldName) const;

protected:
Field(Generator& generator, commsdsl::Field field)
: m_generator(generator),
Expand Down Expand Up @@ -261,6 +263,7 @@ class Field
virtual void setForcedNoOptionsConfigImpl();
virtual bool isVersionDependentImpl() const;
virtual std::string getCommonPreDefinitionImpl(const std::string& scope) const;
virtual bool verifyAliasImpl(const std::string& fieldName) const;

std::string getNameFunc() const;

Expand Down
4 changes: 2 additions & 2 deletions app/commsdsl2comms/src/Generator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ namespace commsdsl2comms
namespace
{

const unsigned MaxDslVersion = 2U;
const std::string MinCommsVersionStr("2, 1, 0");
const unsigned MaxDslVersion = 3U;
const std::string MinCommsVersionStr("2, 2, 0");
const std::string ScopeSep("::");
const std::string ReplaceSuffix(".replace");
const std::string ExtendSuffix(".extend");
Expand Down
84 changes: 84 additions & 0 deletions app/commsdsl2comms/src/Interface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ const std::string ClassTemplate(
" COMMS_MSG_TRANSPORT_FIELDS_ACCESS(\n"
" #^#FIELDS_ACCESS_LIST#$#\n"
" );\n"
" #^#ALIASES#$#\n"
" #^#PUBLIC#$#\n"
"#^#PROTECTED#$#\n"
"#^#PRIVATE#$#\n"
Expand Down Expand Up @@ -285,6 +286,7 @@ bool Interface::writeProtocol()
replacements.insert(std::make_pair("FIELDS_OPTIONS", getFieldsOpts()));
replacements.insert(std::make_pair("ACCESS_FUNCS_DOC", getFieldsAccessDoc()));
replacements.insert(std::make_pair("FIELDS_DEF", getFieldsDef()));
replacements.insert(std::make_pair("ALIASES", getAliases()));
}

auto extraPublic = m_generator.getExtraPublicForInterface(externalRef());
Expand Down Expand Up @@ -488,6 +490,88 @@ std::string Interface::getFieldsAccessList() const
return result;
}

std::string Interface::getAliases() const
{
auto aliases = m_dslObj.aliases();
if (aliases.empty()) {
return common::emptyString();
}

common::StringsList result;
for (auto& a : aliases) {
auto& fieldName = a.fieldName();
assert(!fieldName.empty());

auto dotPos = fieldName.find('.');
std::string firstFieldName(fieldName, 0, dotPos);
auto iter =
std::find_if(
m_fields.begin(), m_fields.end(),
[&firstFieldName](auto& f)
{
return firstFieldName == f->name();
});

if (iter == m_fields.end()) {
continue;
}

std::string restFieldName;
if (dotPos != std::string::npos) {
restFieldName.assign(fieldName, dotPos + 1, fieldName.size());
}

if (!restFieldName.empty() && (!(*iter)->verifyAlias(restFieldName))) {
continue;
}

static const std::string Templ =
"/// @brief Alias to an extra transport member field.\n"
"/// @details\n"
"#^#ALIAS_DESC#$#\n"
"/// Generates field access alias function(s):\n"
"/// @b transportField_#^#ALIAS_NAME#$#() -> <b>transportField_#^#ALIASED_FIELD_DOC#$#</b>\n"
"COMMS_MSG_TRANSPORT_FIELD_ALIAS(#^#ALIAS_NAME#$#, #^#ALIASED_FIELD#$#);\n";

std::vector<std::string> aliasedFields;
ba::split(aliasedFields, fieldName, ba::is_any_of("."));
std::string aliasedFieldDocStr;
std::string aliasedFieldStr;
for (auto& f : aliasedFields) {
common::nameToAccess(f);

if (!aliasedFieldDocStr.empty()) {
aliasedFieldDocStr += ".field_";
}
aliasedFieldDocStr += f + "()";

if (!aliasedFieldStr.empty()) {
aliasedFieldStr += ", ";
}

aliasedFieldStr += f;
}

auto desc = common::makeDoxygenMultilineCopy(a.description());
if (!desc.empty()) {
desc = common::doxygenPrefixStr() + common::indentStr() + desc + " @n";
}

common::ReplacementMap repl;
repl.insert(std::make_pair("ALIAS_NAME", common::nameToAccessCopy(a.name())));
repl.insert(std::make_pair("ALIASED_FIELD_DOC", std::move(aliasedFieldDocStr)));
repl.insert(std::make_pair("ALIASED_FIELD", std::move(aliasedFieldStr)));
repl.insert(std::make_pair("ALIAS_DESC", std::move(desc)));
result.push_back(common::processTemplate(Templ, repl));
}

if (result.empty()) {
return common::emptyString();
}

return '\n' + common::listToString(result, "\n", common::emptyString());
}

std::string Interface::getIncludes() const
{
common::StringsList includes;
Expand Down
1 change: 1 addition & 0 deletions app/commsdsl2comms/src/Interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ class Interface
std::string getDescription() const;
std::string getFieldsClassesList() const;
std::string getFieldsAccessList() const;
std::string getAliases() const;
std::string getIncludes() const;
std::string getFieldsAccessDoc() const;
std::string getFieldsDef() const;
Expand Down
Loading

0 comments on commit e1cf1ab

Please sign in to comment.