17 const std::string ¶Indicator,
const std::string &antiIndicator,
18 const bool optional,
const std::string &extraIndicator)
19 :
SpinStateValidator(
std::move(allowedNumbersOfSpins), acceptSingleStates, paraIndicator, antiIndicator, optional,
20 extraIndicator, true) {}
23 const std::string ¶Indicator,
const std::string &antiIndicator,
24 const bool optional,
const std::string &extraIndicator,
25 const bool rejectRepeatedSpinStates)
26 : TypedValidator<
std::string>(), m_allowedNumbersOfSpins(
std::move(allowedNumbersOfSpins)),
27 m_acceptSingleStates(acceptSingleStates), m_para(paraIndicator), m_anti(antiIndicator), m_optional(optional),
28 m_extra(extraIndicator), m_rejectRepeatedSpinStates(rejectRepeatedSpinStates) {}
40 std::ostringstream msg;
41 msg <<
"Enter a spin state string, it should be a comma-separated list, e.g. ";
51 int numberSpinStates =
static_cast<int>(spinStates.size());
53 return "The number of spin states specified is not an allowed value";
56 if (std::any_of(spinStates.cbegin(), spinStates.cend(), [&](
const std::string &spinState) {
57 const bool isPair = setContains(allowedPairs, spinState);
58 const bool isSingle = m_acceptSingleStates && setContains(allowedSingles, spinState);
59 return !isPair && !isSingle;
61 std::ostringstream msg;
62 msg <<
"The format for the spin states is invalid, every comma separated value should contain ";
74 if (!(containsAnyPairs ^ containsAnySingles)) {
75 return "Single and paired spin states cannot be mixed";
81 std::sort(spinStates.begin(), spinStates.end());
82 auto it = std::unique(spinStates.begin(), spinStates.end());
83 auto numberOfUniqueStates =
static_cast<int>(std::distance(spinStates.begin(), it));
84 if (numberOfUniqueStates < numberSpinStates)
85 return "Each spin state must only appear once";
92 const std::unordered_set<std::string> &set) {
93 return std::any_of(anyOf.cbegin(), anyOf.cend(),
94 [&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="")