17 const std::string ¶Indicator,
const std::string &antiIndicator,
18 const bool optional,
const std::string &extraIndicator)
19 : TypedValidator<
std::string>(), m_allowedNumbersOfSpins(
std::move(allowedNumbersOfSpins)),
20 m_acceptSingleStates(acceptSingleStates), m_para(paraIndicator), m_anti(antiIndicator), m_optional(optional),
21 m_extra(extraIndicator) {}
32 std::ostringstream msg;
33 msg <<
"Enter a spin state string, it should be a comma-separated list, e.g. ";
43 int numberSpinStates =
static_cast<int>(spinStates.size());
45 return "The number of spin states specified is not an allowed value";
48 if (std::any_of(spinStates.cbegin(), spinStates.cend(), [&](
const std::string &spinState) {
49 const bool isPair = setContains(allowedPairs, spinState);
50 const bool isSingle = m_acceptSingleStates && setContains(allowedSingles, spinState);
51 return !isPair && !isSingle;
53 std::ostringstream msg;
54 msg <<
"The format for the spin states is invalid, every comma separated value should contain ";
66 if (!(containsAnyPairs ^ containsAnySingles)) {
67 return "Single and paired spin states cannot be mixed";
72 std::sort(spinStates.begin(), spinStates.end());
73 auto it = std::unique(spinStates.begin(), spinStates.end());
74 auto numberOfUniqueStates =
static_cast<int>(std::distance(spinStates.begin(), it));
75 if (numberOfUniqueStates < numberSpinStates)
76 return "Each spin state must only appear once";
82 const std::unordered_set<std::string> &set) {
83 return std::any_of(anyOf.cbegin(), anyOf.cend(),
84 [&set](
const std::string &stringPair) { return setContains(set, stringPair); });
SpinStateValidator(std::unordered_set< int > allowedNumbersOfSpins, const bool acceptSingleStates=false, const std::string ¶Indicator="0", const std::string &antiIndicator="1", const bool optional=false, const std::string &extraIndicator="")