extend ArgInfo class to also accept "i2_name" and "d2_name"
This commit is contained in:
@ -334,10 +334,11 @@ arguments of commands in LAMMPS are parsed and to make abstractions of
|
|||||||
repetitive tasks.
|
repetitive tasks.
|
||||||
|
|
||||||
The :cpp:class:`LAMMPS_NS::ArgInfo` class provides an abstraction
|
The :cpp:class:`LAMMPS_NS::ArgInfo` class provides an abstraction
|
||||||
for parsing references to compute or fix styles or variables. These
|
for parsing references to compute or fix styles, variables or custom
|
||||||
would start with a "c\_", "f\_", "v\_" followed by the ID or name of
|
integer or double properties handled by :doc:`fix property/atom <fix_property_atom>`.
|
||||||
than instance and may be postfixed with one or two array indices
|
These would start with a "c\_", "f\_", "v\_", "d\_", "d2\_", "i\_", or "i2_"
|
||||||
"[<number>]" with numbers > 0.
|
followed by the ID or name of than instance and may be postfixed with
|
||||||
|
one or two array indices "[<number>]" with numbers > 0.
|
||||||
|
|
||||||
A typical code segment would look like this:
|
A typical code segment would look like this:
|
||||||
|
|
||||||
|
|||||||
@ -30,7 +30,8 @@ using namespace LAMMPS_NS;
|
|||||||
|
|
||||||
ArgInfo::ArgInfo(const std::string &arg, int allowed) : type(NONE), dim(0), index1(-1), index2(-1)
|
ArgInfo::ArgInfo(const std::string &arg, int allowed) : type(NONE), dim(0), index1(-1), index2(-1)
|
||||||
{
|
{
|
||||||
if ((arg.size() > 2) && (arg[1] == '_')) {
|
if (((arg.size() > 3) && (arg[1] == '2') && (arg[2] == '_'))
|
||||||
|
|| ((arg.size() > 2) && (arg[1] == '_'))) {
|
||||||
if ((arg[0] == 'c') && (allowed & COMPUTE))
|
if ((arg[0] == 'c') && (allowed & COMPUTE))
|
||||||
type = COMPUTE;
|
type = COMPUTE;
|
||||||
else if ((arg[0] == 'f') && (allowed & FIX))
|
else if ((arg[0] == 'f') && (allowed & FIX))
|
||||||
@ -46,10 +47,11 @@ ArgInfo::ArgInfo(const std::string &arg, int allowed) : type(NONE), dim(0), inde
|
|||||||
name = arg;
|
name = arg;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
const int offset = (arg[1] == '_') ? 2 : 3;
|
||||||
|
|
||||||
std::size_t has_idx1 = arg.find('[', 2);
|
std::size_t has_idx1 = arg.find('[', offset);
|
||||||
if (has_idx1 != std::string::npos) {
|
if (has_idx1 != std::string::npos) {
|
||||||
name = arg.substr(2, has_idx1 - 2);
|
name = arg.substr(offset, has_idx1 - offset);
|
||||||
dim = 1;
|
dim = 1;
|
||||||
|
|
||||||
std::size_t has_idx2 = arg.find('[', has_idx1 + 1);
|
std::size_t has_idx2 = arg.find('[', has_idx1 + 1);
|
||||||
@ -79,7 +81,7 @@ ArgInfo::ArgInfo(const std::string &arg, int allowed) : type(NONE), dim(0), inde
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
index1 = 0;
|
index1 = 0;
|
||||||
name = arg.substr(2);
|
name = arg.substr(offset);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
index1 = 0;
|
index1 = 0;
|
||||||
|
|||||||
@ -169,6 +169,16 @@ TEST(ArgInfo, variable2)
|
|||||||
ASSERT_THAT(arg.get_name(), StrEq("x"));
|
ASSERT_THAT(arg.get_name(), StrEq("x"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(ArgInfo, variable3)
|
||||||
|
{
|
||||||
|
ArgInfo arg("v_x[11][5]");
|
||||||
|
ASSERT_EQ(arg.get_dim(), 2);
|
||||||
|
ASSERT_EQ(arg.get_type(), ArgInfo::VARIABLE);
|
||||||
|
ASSERT_EQ(arg.get_index1(), 11);
|
||||||
|
ASSERT_EQ(arg.get_index2(), 5);
|
||||||
|
ASSERT_THAT(arg.get_name(), StrEq("x"));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(ArgInfo, dname0)
|
TEST(ArgInfo, dname0)
|
||||||
{
|
{
|
||||||
ArgInfo arg("d_text", ArgInfo::DNAME);
|
ArgInfo arg("d_text", ArgInfo::DNAME);
|
||||||
@ -179,6 +189,36 @@ TEST(ArgInfo, dname0)
|
|||||||
ASSERT_THAT(arg.get_name(), StrEq("text"));
|
ASSERT_THAT(arg.get_name(), StrEq("text"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(ArgInfo, dname1)
|
||||||
|
{
|
||||||
|
ArgInfo arg("d2_text", ArgInfo::DNAME | ArgInfo::INAME);
|
||||||
|
ASSERT_EQ(arg.get_dim(), 0);
|
||||||
|
ASSERT_EQ(arg.get_type(), ArgInfo::DNAME);
|
||||||
|
ASSERT_EQ(arg.get_index1(), 0);
|
||||||
|
ASSERT_EQ(arg.get_index2(), -1);
|
||||||
|
ASSERT_THAT(arg.get_name(), StrEq("text"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ArgInfo, dname2)
|
||||||
|
{
|
||||||
|
ArgInfo arg("d2_text[11]", ArgInfo::DNAME);
|
||||||
|
ASSERT_EQ(arg.get_dim(), 1);
|
||||||
|
ASSERT_EQ(arg.get_type(), ArgInfo::DNAME);
|
||||||
|
ASSERT_EQ(arg.get_index1(), 11);
|
||||||
|
ASSERT_EQ(arg.get_index2(), -1);
|
||||||
|
ASSERT_THAT(arg.get_name(), StrEq("text"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ArgInfo, dname3)
|
||||||
|
{
|
||||||
|
ArgInfo arg("d2_text[24][11]", ArgInfo::DNAME);
|
||||||
|
ASSERT_EQ(arg.get_dim(), 2);
|
||||||
|
ASSERT_EQ(arg.get_type(), ArgInfo::DNAME);
|
||||||
|
ASSERT_EQ(arg.get_index1(), 24);
|
||||||
|
ASSERT_EQ(arg.get_index2(), 11);
|
||||||
|
ASSERT_THAT(arg.get_name(), StrEq("text"));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(ArgInfo, iname0)
|
TEST(ArgInfo, iname0)
|
||||||
{
|
{
|
||||||
ArgInfo arg("i_text", ArgInfo::INAME);
|
ArgInfo arg("i_text", ArgInfo::INAME);
|
||||||
@ -189,6 +229,36 @@ TEST(ArgInfo, iname0)
|
|||||||
ASSERT_THAT(arg.get_name(), StrEq("text"));
|
ASSERT_THAT(arg.get_name(), StrEq("text"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(ArgInfo, iname1)
|
||||||
|
{
|
||||||
|
ArgInfo arg("i2_text", ArgInfo::INAME);
|
||||||
|
ASSERT_EQ(arg.get_dim(), 0);
|
||||||
|
ASSERT_EQ(arg.get_type(), ArgInfo::INAME);
|
||||||
|
ASSERT_EQ(arg.get_index1(), 0);
|
||||||
|
ASSERT_EQ(arg.get_index2(), -1);
|
||||||
|
ASSERT_THAT(arg.get_name(), StrEq("text"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ArgInfo, iname2)
|
||||||
|
{
|
||||||
|
ArgInfo arg("i2_text[2]", ArgInfo::INAME | ArgInfo::DNAME);
|
||||||
|
ASSERT_EQ(arg.get_dim(), 1);
|
||||||
|
ASSERT_EQ(arg.get_type(), ArgInfo::INAME);
|
||||||
|
ASSERT_EQ(arg.get_index1(), 2);
|
||||||
|
ASSERT_EQ(arg.get_index2(), -1);
|
||||||
|
ASSERT_THAT(arg.get_name(), StrEq("text"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ArgInfo, iname3)
|
||||||
|
{
|
||||||
|
ArgInfo arg("i2_text[2][100]", ArgInfo::INAME | ArgInfo::DNAME);
|
||||||
|
ASSERT_EQ(arg.get_dim(), 2);
|
||||||
|
ASSERT_EQ(arg.get_type(), ArgInfo::INAME);
|
||||||
|
ASSERT_EQ(arg.get_index1(), 2);
|
||||||
|
ASSERT_EQ(arg.get_index2(), 100);
|
||||||
|
ASSERT_THAT(arg.get_name(), StrEq("text"));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(ArgInfo, unsupported1)
|
TEST(ArgInfo, unsupported1)
|
||||||
{
|
{
|
||||||
ArgInfo arg("v_text[02][05]", ArgInfo::COMPUTE | ArgInfo::FIX);
|
ArgInfo arg("v_text[02][05]", ArgInfo::COMPUTE | ArgInfo::FIX);
|
||||||
|
|||||||
Reference in New Issue
Block a user