Nektar++
Public Member Functions | Static Public Member Functions | List of all members
Nektar::ParseUtils Class Reference

#include <ParseUtils.h>

Public Member Functions

template<>
bool GenerateVector (const std::string &str, std::vector< std::string > &out)
 Specialised version of ParseUtils::GenerateVector for std::string. More...
 

Static Public Member Functions

static bool GenerateSeqVector (const std::string &str, std::vector< unsigned int > &out)
 Takes a comma-separated compressed string and converts it to entries in a vector. More...
 
template<typename T >
static bool GenerateVector (const std::string &str, std::vector< T > &out)
 Takes a comma-separated string and converts it to entries in a vector. More...
 
template<typename T >
static std::string GenerateSeqString (const std::vector< T > &v)
 Generate a compressed comma-separated string representation of a vector of unsigned integers. More...
 

Detailed Description

Definition at line 46 of file ParseUtils.h.

Member Function Documentation

◆ GenerateSeqString()

template<typename T >
static std::string Nektar::ParseUtils::GenerateSeqString ( const std::vector< T > &  v)
inlinestatic

Generate a compressed comma-separated string representation of a vector of unsigned integers.

This utility routine takes entries of v and returns a string sequence. For example,

std::vector<unsigned int> vec = {1,2,3,4,6,7,8,5,2,3};
std::string output = ParseUtils::GenerateVector(vec);

will produce an output string containing 1-4,6-8,5,2,3.

Parameters
vVector of unsigned integers.
Returns
Compressed comma separated string.

Definition at line 71 of file ParseUtils.h.

72  {
73  static_assert(std::is_integral<T>::value && std::is_unsigned<T>::value,
74  "Unsigned integer type required.");
75 
76  if (v.size() == 0)
77  {
78  return "";
79  }
80 
81  std::ostringstream ss;
82  auto first = v[0], last = v[0];
83 
84  ss << v[0];
85 
86  for (auto &i : v)
87  {
88  if (i != last + 1 && i != last)
89  {
90  if (last != first)
91  {
92  ss << '-' << last;
93  }
94  ss << ',' << i;
95  first = i;
96  }
97  last = i;
98  }
99 
100  if (last != first)
101  {
102  ss << '-' << last;
103  }
104 
105  return ss.str();
106  }

Referenced by Nektar::SolverUtils::DriverAdaptive::ReplaceExpansion(), Nektar::LibUtilities::FieldIOXml::v_Write(), and Nektar::LibUtilities::FieldIOXml::WriteMultiFldFileIDs().

◆ GenerateSeqVector()

bool Nektar::ParseUtils::GenerateSeqVector ( const std::string &  str,
std::vector< unsigned int > &  out 
)
static

Takes a comma-separated compressed string and converts it to entries in a vector.

This routine is the inverse of ParseUtils::GenerateSeqString. For example,

std::string input = "1-4,6-8,5,2,3";
std::vector<unsigned int> output;
ParseUtils::GenerateSeqString(input, output);

produces an output vector with the entries {1,2,3,4,6,7,8,5,2,3}.

Parameters
strInput CSV string of unsigned integers.
outOutput vector.
See also
ParseUtils::GenerateSeqString

Definition at line 108 of file ParseUtils.cpp.

110 {
111  PushBackFunctor<unsigned int> f1(out), f2(out);
112 
113  auto it = str.begin();
114  bool success = qi::phrase_parse(
115  it,
116  str.end(),
117  ((qi::uint_ >> '-' >> qi::uint_)[f2] | qi::uint_[f1]) % ',',
118  qi::ascii::space);
119 
120  return success && it == str.end();
121 }

Referenced by Nektar::LibUtilities::FieldIOXml::ImportFieldDefs(), Nektar::LibUtilities::FieldIOXml::ImportMultiFldFileIDs(), Nektar::FieldUtils::ProcessInnerProduct::Process(), Nektar::SpatialDomains::BoundaryConditions::ReadBoundaryConditions(), Nektar::SpatialDomains::MeshPartition::ReadExpansions(), Nektar::SolverUtils::FilterAeroForces::v_Initialise(), and Nektar::FilterMovingBody::v_Initialise().

◆ GenerateVector() [1/2]

template<>
bool Nektar::ParseUtils::GenerateVector ( const std::string &  str,
std::vector< std::string > &  out 
)

Specialised version of ParseUtils::GenerateVector for std::string.

This routine specialises for the std::string data type as this type is not supported by boost::spirit::qi::auto_.

Definition at line 161 of file ParseUtils.cpp.

163 {
164  auto it = str.begin();
165  bool success = qi::phrase_parse(
166  it, str.end(), +~qi::char_(",") % ',', qi::ascii::space, out);
167  return success && it == str.end();
168 }

◆ GenerateVector() [2/2]

template<typename T >
template bool Nektar::ParseUtils::GenerateVector< float > ( const std::string &  str,
std::vector< T > &  out 
)
static

Takes a comma-separated string and converts it to entries in a vector.

This routine splits up a comma-separated string and returns a vector with the entries. Template specialisations should be defined in this file (and not in the header file) as the use of boost::spirit::qi makes compilation times quite slow.

Parameters
strInput CSV string.
outOutput vector.

Definition at line 135 of file ParseUtils.cpp.

136 {
137  auto it = str.begin();
138  bool success = qi::phrase_parse(
139  it, str.end(), qi::auto_ % ',', qi::ascii::space, out);
140  return success && it == str.end();
141 }

Referenced by Nektar::SolverUtils::ForcingAbsorption::CalcAbsorption(), Nektar::FieldUtils::ProcessInterpPoints::calcCp0(), Nektar::FieldUtils::ProcessInterpPtsToPts::calcCp0(), Nektar::FieldUtils::ProcessInterpPoints::CreateFieldPts(), Nektar::FieldUtils::ProcessInterpPtsToPts::CreateFieldPts(), Nektar::SolverUtils::FilterHistoryPoints::FilterHistoryPoints(), Nektar::LibUtilities::FieldIOHdf5::ImportFieldDef(), Nektar::LibUtilities::FieldIOXml::ImportFieldDefs(), Nektar::FieldUtils::InputDat::Process(), Nektar::FieldUtils::InputXml::Process(), Nektar::FieldUtils::ProcessBoundaryExtract::Process(), Nektar::FieldUtils::ProcessC0Projection::Process(), Nektar::FieldUtils::ProcessInnerProduct::Process(), Nektar::FieldUtils::ProcessInterpField::Process(), Nektar::FieldUtils::ProcessInterpPoints::Process(), Nektar::FieldUtils::ProcessRemoveField::Process(), Nektar::FieldUtils::ProcessWallNormalData::Process(), Nektar::SpatialDomains::MeshPartition::ReadExpansions(), Nektar::IncNavierStokes::SetUpWomersley(), Nektar::LibUtilities::CsvIO::v_ImportFieldData(), Nektar::LibUtilities::PtsIO::v_ImportFieldData(), and Nektar::SolverUtils::Coupling::v_Init().