File indexing completed on 2024-10-06 04:18:10

0001 /*
0002     SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #ifndef KOPENINGHOURS_RULE_P_H
0008 #define KOPENINGHOURS_RULE_P_H
0009 
0010 #include "interval.h"
0011 #include "selectors_p.h"
0012 
0013 
0014 #include <memory>
0015 
0016 namespace KOpeningHours {
0017 
0018 enum class State { // must be in same order as Interval::State
0019     Invalid,
0020     Open,
0021     Closed,
0022     Unknown,
0023     Off // extension, not in Interval::State
0024 };
0025 
0026 /** Result of a rule evalution. */
0027 class RuleResult
0028 {
0029 public:
0030     Interval interval;
0031     enum Mode {
0032         Override,
0033         Merge,
0034     };
0035     Mode mode;
0036 };
0037 
0038 /** Opening hours expression rule. */
0039 class Rule
0040 {
0041 public:
0042     enum Type : short {
0043         NormalRule,
0044         AdditionalRule,
0045         FallbackRule,
0046         GuessRuleType,
0047     };
0048     enum StateFlags : char {
0049         NoFlags,
0050         Off // "off" was used rather than "closed"
0051     };
0052 
0053     Interval::State state() const;
0054     bool hasImplicitState() const;
0055     void setState(State state);
0056     void copyStateFrom(const Rule &otherRule);
0057     bool hasComment() const;
0058     void setComment(const char *str, int len);
0059     int requiredCapabilities() const;
0060     /** Empty rules contain no selectors, have no comment and only implicit state. */
0061     bool isEmpty() const;
0062     bool hasSmallRangeSelector() const;
0063     bool hasWideRangeSelector() const;
0064 
0065     RuleResult nextInterval(const QDateTime &dt, OpeningHoursPrivate *context) const;
0066     QByteArray toExpression() const;
0067 
0068     /** Amount of selectors for this rule. */
0069     int selectorCount() const;
0070 
0071     QString m_comment;
0072     QString m_wideRangeSelectorComment;
0073 
0074     std::unique_ptr<Timespan> m_timeSelector;
0075     std::unique_ptr<WeekdayRange> m_weekdaySelector;
0076     std::unique_ptr<Week> m_weekSelector;
0077     std::unique_ptr<MonthdayRange> m_monthdaySelector;
0078     std::unique_ptr<YearRange> m_yearSelector;
0079     bool m_seen_24_7 = false;
0080     bool m_colonAfterWideRangeSelector = false;
0081 
0082     StateFlags m_stateFlags = NoFlags;
0083     Type m_ruleType = NormalRule;
0084 
0085 private:
0086     Interval::State m_state = Interval::Invalid;
0087 
0088     enum { RecursionLimit = 64 };
0089     RuleResult nextInterval(const QDateTime &dt, OpeningHoursPrivate *context, int recursionBudget) const;
0090 };
0091 
0092 }
0093 
0094 #endif // KOPENINGHOURS_RULE_P_H