ArnLib  4.0.x
Active Registry Network
MQFlags.hpp
Go to the documentation of this file.
1 // Copyright (C) 2010-2022 Michael Wiklund.
2 // All rights reserved.
3 // Contact: arnlib@wiklunden.se
4 //
5 // This file is part of the ArnLib - Active Registry Network.
6 // Parts of ArnLib depend on Qt and/or other libraries that have their own
7 // licenses. Usage of these other libraries is subject to their respective
8 // license agreements.
9 //
10 // The MIT License (MIT) Usage
11 // Permission is hereby granted, free of charge, to any person obtaining a
12 // copy of this file to deal in its contained Software without restriction,
13 // including without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to permit
15 // persons to whom the Software is furnished to do so, subject to the
16 // following conditions:
17 // The above copyright notice and this permission notice shall be included
18 // in all copies or substantial portions of the Software in this file.
19 //
20 // GNU Lesser General Public License Usage
21 // This file may be used under the terms of the GNU Lesser General Public
22 // License version 2.1 as published by the Free Software Foundation and
23 // appearing in the file LICENSE_LGPL.txt included in the packaging of this
24 // file. In addition, as a special exception, you may use the rights described
25 // in the Nokia Qt LGPL Exception version 1.1, included in the file
26 // LGPL_EXCEPTION.txt in this package.
27 //
28 // GNU General Public License Usage
29 // Alternatively, this file may be used under the terms of the GNU General Public
30 // License version 3.0 as published by the Free Software Foundation and appearing
31 // in the file LICENSE_GPL.txt included in the packaging of this file.
32 //
33 // Other Usage
34 // Alternatively, this file may be used in accordance with the terms and conditions
35 // contained in a signed written agreement between you and Michael Wiklund.
36 //
37 // This program is distributed in the hope that it will be useful, but WITHOUT ANY
38 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
39 // PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
40 //
41 
42 #ifndef MQFLAGS_HPP
43 #define MQFLAGS_HPP
44 
45 #include "ArnLib_global.hpp"
46 #include "MQFlagsBase.hpp"
47 #include <QMap>
48 #include <QStringList>
49 #include <QObject>
50 #include <QDebug>
51 
52 #define MQ_NSTXT_FILL_MISSING 0, 0
53 #define MQ_NSTXT_FILL_MISSING_FROM( FromNs) FromNs, 0
54 
55 
57 #define MQ_DECLARE_FLAGSTXT( FEStruct) \
58  MQ_DECLARE_FLAGS( FEStruct) \
59  static Arn::EnumTxt& txt() {static Arn::EnumTxt in( &staticMetaObject, true, _setNs(0), _setSe(0), \
60  #FEStruct); return in;} \
61  inline static const Arn::_InitEnumTxt* _setNs( const Arn::_InitEnumTxt* ieTxt) {return ieTxt;} \
62  inline static const Arn::_InitSubEnum* _setSe( const Arn::_InitSubEnum* isEnum) {return isEnum;} \
63  inline static const char* name() {return txt().name();} \
64  inline QString toString( quint16 nameSpace = 0) const {return txt().flagsToString( f, nameSpace);} \
65  inline static FEStruct fromString( const QString& text, quint16 nameSpace = 0) \
66  {return FEStruct( F( txt().flagsFromString( text, nameSpace)));}
67 
68 
69 #define MQ_DECLARE_FLAGS_NSTXT(...) \
70  static const Arn::_InitEnumTxt* _setNs(int dummy) { \
71  Q_UNUSED(dummy) \
72  static Arn::_InitEnumTxt initTxt[] = { __VA_ARGS__ , { 0, 0, arnNullptr }}; \
73  return initTxt; \
74  };
75 
76 #define MQ_DECLARE_SUBETXT(...) \
77  static const Arn::_InitSubEnum* _setSe( int dummy) { \
78  Q_UNUSED(dummy) \
79  static Arn::_InitSubEnum initSubEnum[] = { __VA_ARGS__ , { arnNullptr, 0, 0 }}; \
80  return initSubEnum; \
81  };
82 
83 #define MQ_SUBETXT_ADD_RELDEF( EStruct, Mask, Factor) \
84  { &EStruct::txt(), Mask, Factor}
85 
86 #define MQ_SUBETXT_ADD_ABSDEF( EStruct, Mask) \
87  MQ_SUBETXT_ADD_RELDEF( EStruct, Mask, 1)
88 
89 #define MQ_SUBETXT_ADD_RELOP( EStruct, Mask, Factor) \
90  inline void setSubEnum( EStruct::E v_) { \
91  setBits( Mask, v_ * Factor); \
92  } \
93  inline EStruct::E getSubEnum_##EStruct() { \
94  return EStruct::E( (f & Mask) / Factor); \
95  }
96 
97 #define MQ_SUBETXT_ADD_ABSOP( EStruct, Mask) \
98  MQ_SUBETXT_ADD_RELOP( EStruct, Mask, 1) \
99 
100 
102 #define MQ_DECLARE_ENUMTXT( EStruct) \
103  MQ_DECLARE_ENUM( EStruct) \
104  static Arn::EnumTxt& txt() {static Arn::EnumTxt in( &staticMetaObject, false, _setNs(0), arnNullptr, \
105  #EStruct); return in;} \
106  inline static const Arn::_InitEnumTxt* _setNs( const Arn::_InitEnumTxt* ieTxt) {return ieTxt;} \
107  inline static const char* name() {return txt().name();} \
108  inline QString toString( quint16 nameSpace = 0) const {return txt().getTxtString( e, nameSpace);} \
109  inline static EStruct fromString( const QString& text, quint16 nameSpace = 0) \
110  {return EStruct( E( txt().getEnumVal( text, 0, nameSpace)));}
111 
112 
113 #define MQ_DECLARE_ENUM_NSTXT(...) \
114  static const Arn::_InitEnumTxt* _setNs(int dummy) { \
115  Q_UNUSED(dummy) \
116  static Arn::_InitEnumTxt initTxt[] = { __VA_ARGS__ , { 0, 0, 0 }}; \
117  return initTxt; \
118  };
119 
120 
121 namespace Arn {
122 class XStringMap;
123 class EnumTxt;
124 }
125 
126 struct QMetaObject;
127 
128 
129 namespace Arn {
130 
131 typedef struct {
132  int ns;
133  int enumVal;
134  const char* enumTxt;
135 } _InitEnumTxt;
136 
137 typedef struct {
139  uint mask;
140  uint factor;
141 } _InitSubEnum;
142 
144 
170 
172 
212 class EnumTxt
213 {
214 public:
215  struct IncludeMode {
216  enum E {
218  OnlyMulti1Bits, // Also include number 0 (no 1 bits at all)
222  };
224  };
225 
226  EnumTxt( const QMetaObject* metaObj, bool isFlag, const _InitEnumTxt* initTxt, const _InitSubEnum* initSubEnum,
227  const char* name);
228 
230 
238  explicit EnumTxt( bool isFlag = false, const QString& name = QString());
239 
240  ~EnumTxt();
241 
242  void setTxtRef( const char* txt, int enumVal, quint16 nameSpace);
243 
245 
260  void setTxt( const char* txt, int enumVal, quint16 nameSpace);
261 
263 
269  const char* getTxt( int enumVal, quint16 nameSpace = 0, bool* isFound = arnNullptr) const;
270 
272 
278  void setTxtString( const QString& txt, int enumVal, quint16 nameSpace);
279 
281 
288  QString getTxtString( int enumVal, quint16 nameSpace = 0, bool* isFound = arnNullptr) const;
289 
291 
298  int getEnumVal( const char* txt, int defaultVal = 0, quint16 nameSpace = 0, bool* isFound = arnNullptr) const;
299 
301 
309  int getEnumVal( const QString& txt, int defaultVal = 0, quint16 nameSpace = 0, bool* isFound = arnNullptr) const;
310 
312 
328  bool getSubEnumVal( const char* txt, int& subEnumVal, uint& bitMask, quint16 nameSpace = 0) const;
329 
331 
347  bool getSubEnumVal( const QString& txt, int& subEnumVal, uint& bitMask, quint16 nameSpace = 0) const;
348 
350 
364  void addFlagsTo( Arn::XStringMap& xsm, const IncludeMode& incMode, quint16 nameSpace = 0, bool neverHumanize = false) const;
365 
367 
380  void addSubEnumTo( Arn::XStringMap& xsm, quint16 nameSpace = 0, bool neverHumanize = false) const;
381 
383 
397  void addBitSetTo( Arn::XStringMap& xsm, quint16 nameSpace = 0, bool neverHumanize = false) const;
398 
399  void addBitSet( Arn::XStringMap& xsm, quint16 nameSpace = 0, bool neverHumanize = false) const // Legacy
400  {addBitSetTo( xsm, nameSpace, neverHumanize);}
401 
403 
411  QString getBitSet( quint16 nameSpace = 0, bool neverHumanize = false) const;
412 
414 
429  void addSubEnumPlainTo( Arn::XStringMap& xsm, quint16 nameSpace = 0, bool neverHumanize = false) const;
430 
432 
444  QString flagsToString( int val, quint16 nameSpace = 0) const;
445 
447 
459  QStringList flagsToStringList( int val, quint16 nameSpace = 0) const;
460 
462 
472  int flagsFromString( const QString& flagString, quint16 nameSpace = 0);
473 
475 
486  int flagsFromStringList( const QStringList& flagStrings, quint16 nameSpace = 0);
487 
489 
501  void addEnumSetTo( Arn::XStringMap& xsm, quint16 nameSpace = 0, bool neverHumanize = false) const;
502 
503  void addEnumSet( Arn::XStringMap& xsm, quint16 nameSpace = 0, bool neverHumanize = false) const // Legacy
504  {addEnumSetTo( xsm, nameSpace, neverHumanize);}
505 
507 
515  QString getEnumSet( quint16 nameSpace = 0, bool neverHumanize = false) const;
516 
518 
528  QStringList getBasicTextList( quint16 nameSpace = 0, bool neverHumanize = false) const;
529 
531 
540  void addSubEnum( const EnumTxt& subEnum, uint bitMask, uint factor);
541 
543 
548  const char* name() const;
549 
551 
556  int enumCount() const;
557 
559 
569  void setMissingTxt( quint16 toNameSpace, quint16 fromNameSpace = 0, bool neverHumanize = false);
570 
572 
585  static QString humanize( const QString& txt);
586 
588 
590  bool isFlag() const;
591 
593 
595  void clear();
596 
598 
607  bool loadEnumSet( const Arn::XStringMap& xsm, const QString& name = QString());
608 
610 
619  bool loadEnumSet( const QString& xstr, const QString& name = QString());
620 
622 
631  bool loadBitSet( const Arn::XStringMap& xsm, const QString& name = QString());
632 
634 
643  bool loadBitSet( const QString& xstr, const QString& name = QString());
644 
646 
651  int subEnumCount() const;
652 
654 
666  QString subEnumNameAt( int idx, quint16 nameSpace = 0) const;
667 
669 
678  bool subEnumPropAt( int idx, uint& bitMask, uchar& bitPos) const;
679 
681 
692  const EnumTxt* subEnumAt( int idx) const;
693 
694  static QByteArray numToStr( uint num);
695  static uint strToNum( const QByteArray& str, bool* isOk = arnNullptr);
696  static uchar strToBitpos( const QByteArray& str, bool* isOk = arnNullptr);
697 
698 private:
699  struct EnumTxtKey {
700  uint _enumVal;
701  quint16 _nameSpace;
702  bool _isFlag;
703  bool _isSingleBit; // Only for flags
704 
705  EnumTxtKey( uint enumVal, quint16 nameSpace, bool isFlag);
706  bool operator <( const EnumTxtKey& other) const;
707  };
708  struct SubEnumEntry {
709  const EnumTxt* _subEnum;
710  uint _bitMask;
711  uchar _bitPos;
712  bool _isLocalOwn;
713  SubEnumEntry( const EnumTxt& subEnum, uint bitMask, uint factor, bool isLocalOwn);
714  };
715 
716  void setTxtRefAny( const char* txt, int enumVal, quint16 nameSpace);
717  void addSubEnumAny( const EnumTxt& subEnum, uint bitMask, uint factor, bool isLocalOwn);
718  void setupFromMetaObject();
719  void setupTxt( const _InitEnumTxt* initTxt);
720  void setupSubEnum( const _InitSubEnum* initSubEnum);
721 
722  const QMetaObject* _metaObj;
723  QMap<EnumTxtKey,const char*> _enumTxtTab;
724  QList<QByteArray>* _txtStore;
725  QList<SubEnumEntry>* _subEnumTab;
726  QByteArray _name;
727  uint _subEnumMask;
728  bool _isFlag;
729 };
730 
731 }
732 
733 #endif // MQFLAGS_HPP
QStringList flagsToStringList(int val, quint16 nameSpace=0) const
returns string list for enum flags
Definition: MQFlags.cpp:313
QString getEnumSet(quint16 nameSpace=0, bool neverHumanize=false) const
returns the enum set string
Definition: MQFlags.cpp:429
static uchar strToBitpos(const QByteArray &str, bool *isOk=arnNullptr)
Definition: MQFlags.cpp:765
void addSubEnumPlainTo(Arn::XStringMap &xsm, quint16 nameSpace=0, bool neverHumanize=false) const
Adds all sub enum plain and shifted to a XStringMap.
Definition: MQFlags.cpp:281
void setTxt(const char *txt, int enumVal, quint16 nameSpace)
Set an additional text for an enum val in a namespace.
Definition: MQFlags.cpp:107
void addEnumSetTo(Arn::XStringMap &xsm, quint16 nameSpace=0, bool neverHumanize=false) const
Adds enum set to a XStringMap.
Definition: MQFlags.cpp:406
int flagsFromStringList(const QStringList &flagStrings, quint16 nameSpace=0)
returns enum flags from string list
Definition: MQFlags.cpp:362
QStringList getBasicTextList(quint16 nameSpace=0, bool neverHumanize=false) const
returns a string list containing the most basic texts
Definition: MQFlags.cpp:437
Class Enum text.
Definition: MQFlags.hpp:212
QString flagsToString(int val, quint16 nameSpace=0) const
returns text string for enum flags
Definition: MQFlags.cpp:305
bool isFlag() const
Returns true if this is a flag usage.
Definition: MQFlags.cpp:568
QString getBitSet(quint16 nameSpace=0, bool neverHumanize=false) const
returns the bit set string for enum flags
Definition: MQFlags.cpp:271
Container class with string representation for serialized data.
Definition: XStringMap.hpp:107
bool getSubEnumVal(const char *txt, int &subEnumVal, uint &bitMask, quint16 nameSpace=0) const
Returns the shifted enum value and the mask for a subEnum text in a namespace.
Definition: MQFlags.cpp:169
void addEnumSet(Arn::XStringMap &xsm, quint16 nameSpace=0, bool neverHumanize=false) const
Definition: MQFlags.hpp:503
const char * enumTxt
Definition: MQFlags.hpp:134
void addBitSetTo(Arn::XStringMap &xsm, quint16 nameSpace=0, bool neverHumanize=false) const
Adds bit set for enum flags to a XStringMap.
Definition: MQFlags.cpp:262
int enumCount() const
returns number of enumerators in the enum (class)
Definition: MQFlags.cpp:736
void addFlagsTo(Arn::XStringMap &xsm, const IncludeMode &incMode, quint16 nameSpace=0, bool neverHumanize=false) const
Adds enum flags to a XStringMap.
Definition: MQFlags.cpp:193
static QByteArray numToStr(uint num)
Definition: MQFlags.cpp:745
void addSubEnum(const EnumTxt &subEnum, uint bitMask, uint factor)
Adds an other EnumTxt as a subEnum to this flag EnumTxt.
Definition: MQFlags.cpp:451
int subEnumCount() const
Returns number of subEnums in this bitSet (class)
Definition: MQFlags.cpp:695
void setTxtString(const QString &txt, int enumVal, quint16 nameSpace)
Set an additional text for an enum val in a namespace.
Definition: MQFlags.cpp:130
const EnumTxt * subEnumAt(int idx) const
Returns a pointer to a SubEnum.
Definition: MQFlags.cpp:722
void setTxtRef(const char *txt, int enumVal, quint16 nameSpace)
Definition: MQFlags.cpp:100
Definition: Arn.cpp:43
EnumTxt * enumTxtClass
Definition: MQFlags.hpp:138
bool loadBitSet(const Arn::XStringMap &xsm, const QString &name=QString())
Loads the instance by an bit set (flags) XStringMap.
Definition: MQFlags.cpp:625
void addSubEnumTo(Arn::XStringMap &xsm, quint16 nameSpace=0, bool neverHumanize=false) const
Adds sub enum flags to a XStringMap.
Definition: MQFlags.cpp:236
int getEnumVal(const char *txt, int defaultVal=0, quint16 nameSpace=0, bool *isFound=arnNullptr) const
Returns the enum value for a text in a namespace.
Definition: MQFlags.cpp:142
const char * name() const
returns the name of the enum (class)
Definition: MQFlags.cpp:730
void clear()
Clear this dynamic instance to its starting state.
Definition: MQFlags.cpp:574
QString getTxtString(int enumVal, quint16 nameSpace=0, bool *isFound=arnNullptr) const
Returns the text for a enum value in a namespace.
Definition: MQFlags.cpp:136
bool subEnumPropAt(int idx, uint &bitMask, uchar &bitPos) const
Returns the properties of a SubEnum.
Definition: MQFlags.cpp:711
QString subEnumNameAt(int idx, quint16 nameSpace=0) const
Returns the name of a SubEnum.
Definition: MQFlags.cpp:702
const char * getTxt(int enumVal, quint16 nameSpace=0, bool *isFound=arnNullptr) const
Returns the text for a enum value in a namespace.
Definition: MQFlags.cpp:121
static uint strToNum(const QByteArray &str, bool *isOk=arnNullptr)
Definition: MQFlags.cpp:754
void addBitSet(Arn::XStringMap &xsm, quint16 nameSpace=0, bool neverHumanize=false) const
Definition: MQFlags.hpp:399
static QString humanize(const QString &txt)
returns the humanized text
Definition: MQFlags.cpp:497
int flagsFromString(const QString &flagString, quint16 nameSpace=0)
returns enum flags from string
Definition: MQFlags.cpp:354
EnumTxt(const QMetaObject *metaObj, bool isFlag, const _InitEnumTxt *initTxt, const _InitSubEnum *initSubEnum, const char *name)
Definition: MQFlags.cpp:63
#define MQ_DECLARE_ENUM(EStruct)
Enums.
Definition: MQFlagsBase.hpp:70
bool loadEnumSet(const Arn::XStringMap &xsm, const QString &name=QString())
Loads the instance by an enum set XStringMap.
Definition: MQFlags.cpp:599
void setMissingTxt(quint16 toNameSpace, quint16 fromNameSpace=0, bool neverHumanize=false)
Copies missing enum texts from one namespace to another.
Definition: MQFlags.cpp:469