/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2001-2026 German Aerospace Center (DLR) and others.3// This program and the accompanying materials are made available under the4// terms of the Eclipse Public License 2.0 which is available at5// https://www.eclipse.org/legal/epl-2.0/6// This Source Code may also be made available under the following Secondary7// Licenses when the conditions for such availability set forth in the Eclipse8// Public License 2.0 are satisfied: GNU General Public License, version 29// or later which is available at10// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html11// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later12/****************************************************************************/13/// @file GNETagProperties.h14/// @author Pablo Alvarez Lopez15/// @date Jan 202016///17// Abstract Base class for tag properties used in GNEAttributeCarrier18/****************************************************************************/19#pragma once20#include <config.h>2122#include <netedit/GNEViewNetHelper.h>23#include <utils/common/FileBucket.h>24#include <utils/gui/globjects/GUIGlObjectTypes.h>25#include <utils/gui/images/GUIIcons.h>2627#include "GNEAttributeProperties.h"2829// ===========================================================================30// class definitions31// ===========================================================================3233class GNETagProperties {3435public:3637/// @brief tag types38enum class Type : std::uint64_t {39// basic types40NETWORKELEMENT = 1ULL << 0, // Network elements (Edges, Junctions, Lanes...)41ADDITIONALELEMENT = 1ULL << 1, // Additional elements (Bus Stops, Charging Stations, Detectors...)42DEMANDELEMENT = 1ULL << 2, // Demand elements (Routes, Vehicles, Trips...)43DATAELEMENT = 1ULL << 3, // Data elements (DataSets, Data Intervals, EdgeData...)44// sub additional elements45STOPPINGPLACE = 1ULL << 4, // StoppingPlaces (BusStops, ChargingStations...)46DETECTOR = 1ULL << 5, // Detectors (E1, E2...)47CALIBRATOR = 1ULL << 6, // Calibrators48SHAPE = 1ULL << 7, // Shapes (Polygons and POIs)49TAZELEMENT = 1ULL << 8, // Traffic Assignment Zones50WIRE = 1ULL << 9, // Wire elements51JUPEDSIM = 1ULL << 10, // JuPedSim elements52// sub demand elements53VTYPE = 1ULL << 11, // Vehicle types (vType and vTypeDistribution)54VEHICLE = 1ULL << 12, // Vehicles (Vehicles, trips, flows...)55ROUTE = 1ULL << 13, // Routes and embedded routes56STOP_VEHICLE = 1ULL << 14, // Vehicle stops57WAYPOINT_VEHICLE = 1ULL << 15, // Vehicle waypoints (note: All waypoints are also Stops)58FLOW = 1ULL << 16, // Flows59// persons60PERSON = 1ULL << 17, // Persons (Persons and personFlows)61PERSONPLAN = 1ULL << 18, // Person plans (Walks, rides, personTrips and stopPersons)62PERSONTRIP = 1ULL << 19, // Person Trips63WALK = 1ULL << 20, // Walks64RIDE = 1ULL << 21, // Rides65STOP_PERSON = 1ULL << 22, // Person stops66// containers67CONTAINER = 1ULL << 23, // Containers (Containers and personFlows)68CONTAINERPLAN = 1ULL << 24, // Container plans (transport, tranships and containerStops)69TRANSPORT = 1ULL << 25, // Transport70TRANSHIP = 1ULL << 26, // Tranship71STOP_CONTAINER = 1ULL << 27, // Container stops72// sub data elements73GENERICDATA = 1ULL << 28, // Generic data (GNEEdgeData, GNELaneData...)74MEANDATA = 1ULL << 29, // Mean datas75// distributions76DISTRIBUTION = 1ULL << 30, // Element is a distribution (routeDistribution or vTypeDistribution)77DISTRIBUTIONREF = 1ULL << 31, // Element is a distribution reference of routeDistribution or vTypeDistribution78// other79INTERNALLANE = 1ULL << 32, // Internal Lane80OTHER = 1ULL << 33, // Other type (used for TAZSourceSinks, VTypes, etc.)81};8283/// @brief tag property84enum class Property : std::uint64_t {85NOTDRAWABLE = 1ULL << 0, // Element cannot be drawn in view86GEOSHAPE = 1ULL << 1, // Element's shape acn be defined using a GEO Shape87DIALOG = 1ULL << 2, // Element can be edited using a dialog (GNECalibratorDialog, GNERerouterDialog...)88XMLCHILD = 1ULL << 3, // Element is child of another element and will be written in XML (Example: E3Entry -> E3Detector...)89REPARENT = 1ULL << 4, // Element can be reparent90NOTSELECTABLE = 1ULL << 5, // Element cannot be selected91NOPARAMETERS = 1ULL << 6, // Element doesn't accept parameters "key1=value1|key2=value2|...|keyN=valueN" (by default all tags supports parameters)92RTREE = 1ULL << 7, // Element is placed in RTREE93CENTERAFTERCREATION = 1ULL << 8, // Camera is moved after element creation94REQUIRE_PROJ = 1ULL << 9, // Element require a geo-projection defined in network95VCLASS_ICON = 1ULL << 10, // Element returns icon depending of their vClass96SYMBOL = 1ULL << 11, // Element is a symbol (VSSSymbols, RerouterSymbols...)97EXTENDED = 1ULL << 12, // Element contains extended attributes (Usually vTypes)98HIERARCHICAL = 1ULL << 13, // Element is a hierarchical99LISTED = 1ULL << 14, // Element is a listed elements (for example, rerouter children)100NO_PROPERTY = 1ULL << 15, // Element doesn't have properties101};102103/// @brief element in which this element is placed104enum class Over : std::uint64_t {105VIEW = 1ULL << 0, // No parents106JUNCTION = 1ULL << 1, // Placed over junction107EDGE = 1ULL << 2, // Placed over edge108EDGES = 1ULL << 3, // Placed over edges109CONSECUTIVE_EDGES = 1ULL << 4, // Placed over consecutive110LANE = 1ULL << 5, // Placed over lane111LANES = 1ULL << 6, // Placed over lanes112CONSECUTIVE_LANES = 1ULL << 4, // Placed over consecutive lanes113ROUTE = 1ULL << 7, // Placed over route114ROUTE_EMBEDDED = 1ULL << 8, // Placed over route embedded115BUSSTOP = 1ULL << 9, // Placed over busStop116TRAINSTOP = 1ULL << 10, // Placed over trainStop117CONTAINERSTOP = 1ULL << 11, // Placed over containerStop118CHARGINGSTATION = 1ULL << 12, // Placed over charging station119PARKINGAREA = 1ULL << 13, // Placed over parking area120FROM_EDGE = 1ULL << 14, // Starts in edge121FROM_TAZ = 1ULL << 15, // Starts in TAZ122FROM_JUNCTION = 1ULL << 16, // Starts in junction123FROM_BUSSTOP = 1ULL << 17, // Starts in busStop124FROM_TRAINSTOP = 1ULL << 18, // Starts in trainStop125FROM_CONTAINERSTOP = 1ULL << 19, // Starts in containerStop126FROM_CHARGINGSTATION = 1ULL << 20, // Starts in chargingStation127FROM_PARKINGAREA = 1ULL << 21, // Starts in parkingArea128TO_EDGE = 1ULL << 22, // Ends in edge129TO_TAZ = 1ULL << 23, // Ends in TAZ130TO_JUNCTION = 1ULL << 24, // Ends in junction131TO_BUSSTOP = 1ULL << 25, // Ends in busStop132TO_TRAINSTOP = 1ULL << 26, // Ends in trainStop133TO_CONTAINERSTOP = 1ULL << 27, // Ends in containerStop134TO_CHARGINGSTATION = 1ULL << 28, // Ends in chargingStation135TO_PARKINGAREA = 1ULL << 29, // Ends in parkingArea136};137138// @brief conflicts139enum class Conflicts : std::uint64_t {140POS_LANE = 1ULL << 0, // Position over lane isn't valid141POS_LANE_START = 1ULL << 1, // Start position over lane isn't valid142POS_LANE_END = 1ULL << 2, // End position over lane isn't valid143NO_ADDITIONAL_CHILDREN = 1ULL << 3, // Element doesn't have additional children144NO_CONFLICTS = 1ULL << 4, // Element doesn't have conflicts145};146147/// @brief declare friend class148friend class GNEAttributeProperties;149150/// @brief parameter constructor151GNETagProperties(const SumoXMLTag tag, GNETagProperties* parent, const GNETagProperties::Type type, const GNETagProperties::Property property,152const GNETagProperties::Over over, const FileBucket::Type bucketType, const GNETagProperties::Conflicts conflicts, const GUIIcon icon,153const GUIGlObjectType GLType, const SumoXMLTag XMLTag, const std::string tooltipText, std::vector<SumoXMLTag> XMLParentTags = {},154const unsigned int backgroundColor = FXRGBA(255, 255, 255, 255), const std::string selectorText = "");155156/// @brief parameter constructor for hierarchical elements157GNETagProperties(const SumoXMLTag tag, GNETagProperties* parent, const GUIIcon icon, const std::string tooltip,158const unsigned int backgroundColor = FXRGBA(255, 255, 255, 255), const std::string selectorText = "");159160/// @brief destructor161~GNETagProperties();162163/// @brief get Tag vinculated with this attribute Property164SumoXMLTag getTag() const;165166/// @brief get Tag vinculated with this attribute Property in String Format (used to avoid multiple calls to toString(...)167const std::string& getTagStr() const;168169/// @brief check Tag integrity (this include all their attributes)170void checkTagIntegrity() const;171172/// @brief get field string (by default tag in string format)173const std::string& getSelectorText() const;174175/// @brief get tooltip text176const std::string& getTooltipText() const;177178/// @brief get background color179unsigned int getBackGroundColor() const;180181/// @brief get all attribute properties182const std::vector<const GNEAttributeProperties*>& getAttributeProperties() const;183184/// @brief get attribute propety associated with the given Sumo XML Attribute (throw error if doesn't exist)185const GNEAttributeProperties* getAttributeProperties(SumoXMLAttr attr) const;186187/// @brief get attribute propety by index (throw error if doesn't exist)188const GNEAttributeProperties* getAttributeProperties(const int index) const;189190/// @brief get attribute value191const GNEAttributeProperties* at(int index) const;192193/// @brief check if current TagProperties owns the attribute "attr"194bool hasAttribute(SumoXMLAttr attr) const;195196/// @brief get number of attributes197int getNumberOfAttributes() const;198199/// @brief get GUI icon associated to this tag property200GUIIcon getGUIIcon() const;201202/// @brief get GUIGlObjectType associated with this tag property203GUIGlObjectType getGLType() const;204205/// @brief default values206/// @{207208/// @brief get XML tag209SumoXMLTag getXMLTag() const;210211/// @brief get XML parent tags212const std::vector<SumoXMLTag>& getXMLParentTags() const;213214/// @brief return true if tag correspond to an element that can be reparent215bool canBeReparent() const;216217/// @brief default values218/// @{219220/// @brief return the default value of the attribute of an element221const std::string& getDefaultStringValue(SumoXMLAttr attr) const;222223/// @brief get default int value224int getDefaultIntValue(SumoXMLAttr attr) const;225226/// @brief get default double value227double getDefaultDoubleValue(SumoXMLAttr attr) const;228229/// @brief get default time value230SUMOTime getDefaultTimeValue(SumoXMLAttr attr) const;231232/// @brief get default bool value233bool getDefaultBoolValue(SumoXMLAttr attr) const;234235/// @brief get default bool value236const RGBColor& getDefaultColorValue(SumoXMLAttr attr) const;237238/// @}239240/// @brief hierarchy functions241/// @{242243/// @brief get hierarchical parent of this element244const GNETagProperties* getHierarchicalParent() const;245246/// @brief get all parents, beginning from current element (root not included) until this element247const std::vector<const GNETagProperties*> getHierarchicalParentsRecuersively() const;248249/// @brief get children of this tag property250const std::vector<const GNETagProperties*>& getHierarchicalChildren() const;251252/// @brief get all children tags (Including children of their children)253std::vector<const GNETagProperties*> getHierarchicalChildrenRecursively() const;254255/// @brief get all children attributes sorted by name (Including this)256std::map<std::string, const GNEAttributeProperties*> getHierarchicalChildrenAttributesRecursively(const bool onlyCommon, const bool onlyDrawables) const;257258/// @}259260/// @brief get supermode associated with this tag261Supermode getSupermode() const;262263/// @brief check if this is a hierarchical tag264bool isHierarchicalTag() const;265266/// @brief network elements267/// @{268269/// @brief return true if tag correspond to a network element270bool isNetworkElement() const;271272/// @brief return true if tag correspond to an additional element (note: this include TAZ, shapes and wires)273bool isAdditionalElement() const;274275/// @brief return true if tag correspond to a pure additional element276bool isAdditionalPureElement() const;277278/// @brief return true if tag correspond to a demand element279bool isDemandElement() const;280281/// @brief return true if tag correspond to a data element282bool isDataElement() const;283284/// @brief return true if tag correspond to a other element (sourceSinks, vTypes, etc.)285bool isOtherElement() const;286287/// @}288289/// @brief additional elements290/// @{291/// @brief return true if tag correspond to a detector (Only used to group all stoppingPlaces in the output XML)292bool isStoppingPlace() const;293294/// @brief return true if tag correspond to a shape (Only used to group all detectors in the XML)295bool isDetector() const;296297/// @brief return true if tag correspond to a calibrator (Only used to group all detectors in the XML)298bool isCalibrator() const;299300/// @brief return true if tag correspond to a shape301bool isShapeElement() const;302303/// @brief return true if tag correspond to a TAZ element304bool isTAZElement() const;305306/// @brief return true if tag correspond to a Wire element307bool isWireElement() const;308309/// @brief return true if tag correspond to a JuPedSim element310bool isJuPedSimElement() const;311312/// @}313314/// @brief demand elements315/// @{316/// @brief return true if tag correspond to a vehicle/person/container type element317bool isType() const;318319/// @brief return true if tag correspond to a vehicle element320bool isVehicle() const;321322/// @brief return true if tag correspond to a route element323bool isRoute() const;324325/// @brief return true if tag correspond to a vehicle stop element326bool isVehicleStop() const;327328/// @brief return true if tag correspond to a vehicle waypoint element329bool isVehicleWaypoint() const;330331/// @brief return true if tag correspond to a flow element332bool isFlow() const;333334/// @brief return true if tag correspond to a person element335bool isPerson() const;336337/// @brief return true if tag correspond to a container element338bool isContainer() const;339340/// @brief return true if tag correspond to an element with a type as a first parent341bool hasTypeParent() const;342343/// @brief return true if tag correspond to a distribution element344bool isDistribution() const;345346/// @brief return true if tag correspond to a dstribution reference element347bool isDistributionReference() const;348349/// @brief return true if tag correspond to a type distribution element350bool isTypeDistribution() const;351352/// @brief return true if tag correspond to a route distribution element353bool isRouteDistribution() const;354355/// @}356357/// @brief plans358/// @{359/// @brief return true if tag correspond to a plan360bool isPlan() const;361362/// @brief return true if tag correspond to a person plan363bool isPlanPerson() const;364365/// @brief return true if tag correspond to a container plan366bool isPlanContainer() const;367368/// @brief return true if tag correspond to a person trip plan369bool isPlanPersonTrip() const;370371/// @brief return true if tag correspond to a walk plan372bool isPlanWalk() const;373374/// @brief return true if tag correspond to a ride plan375bool isPlanRide() const;376377/// @brief return true if tag correspond to a transport378bool isPlanTransport() const;379380/// @brief return true if tag correspond to a tranship381bool isPlanTranship() const;382383/// @brief return true if tag correspond to a stop plan384bool isPlanStop() const;385386/// @brief return true if tag correspond to a person stop plan387bool isPlanStopPerson() const;388389/// @brief return true if tag correspond to a container stop plan390bool isPlanStopContainer() const;391392/// @}393394/// @brief data elements395/// @{396/// @brief return true if tag correspond to a generic data element397bool isGenericData() const;398399/// @brief return true if tag correspond to a mean data element400bool isMeanData() const;401402/// @}403404/// @brief plan parents405/// @{406407/// @brief return true if tag correspond to a vehicle placed over a route408bool vehicleRoute() const;409410/// @brief return true if tag correspond to a vehicle placed over an embedded route411bool vehicleRouteEmbedded() const;412413/// @brief return true if tag correspond to a vehicle placed over from-to edges414bool vehicleEdges() const;415416/// @brief return true if tag correspond to a vehicle placed over from-to junctions417bool vehicleJunctions() const;418419/// @brief return true if tag correspond to a vehicle placed over from-to TAZs420bool vehicleTAZs() const;421422/// @}423424/// @brief plan parents425/// @{426/// @brief return true if tag correspond to a plan placed over edges427bool planConsecutiveEdges() const;428429/// @brief return true if tag correspond to a plan placed over route430bool planRoute() const;431432/// @brief return true if tag correspond to a plan placed over edge433bool planEdge() const;434435/// @brief return true if tag correspond to a plan placed over busStop436bool planBusStop() const;437438/// @brief return true if tag correspond to a plan placed over trainStop439bool planTrainStop() const;440441/// @brief return true if tag correspond to a plan placed over containerStop442bool planContainerStop() const;443444/// @brief return true if tag correspond to a plan placed over chargingStation445bool planChargingStation() const;446447/// @brief return true if tag correspond to a plan placed over parkingArea448bool planParkingArea() const;449450/// @brief return true if tag correspond to a plan placed in stoppingPlace451bool planStoppingPlace() const;452453/// @brief return true if tag correspond to a plan with from-to parents454bool planFromTo() const;455456/// @brief return true if tag correspond to a plan that starts in edge457bool planFromEdge() const;458459/// @brief return true if tag correspond to a plan that starts in TAZ460bool planFromTAZ() const;461462/// @brief return true if tag correspond to a plan that starts in junction463bool planFromJunction() const;464465/// @brief return true if tag correspond to a plan that starts in busStop466bool planFromBusStop() const;467468/// @brief return true if tag correspond to a plan that starts in trainStop469bool planFromTrainStop() const;470471/// @brief return true if tag correspond to a plan that starts in containerStop472bool planFromContainerStop() const;473474/// @brief return true if tag correspond to a plan that starts in chargingStation475bool planFromChargingStation() const;476477/// @brief return true if tag correspond to a plan that starts in parkingAera478bool planFromParkingArea() const;479480/// @brief return true if tag correspond to a plan that starts in stoppingPlace481bool planFromStoppingPlace() const;482483/// @brief return true if tag correspond to a plan that starts in edge484bool planToEdge() const;485486/// @brief return true if tag correspond to a plan that starts in TAZ487bool planToTAZ() const;488489/// @brief return true if tag correspond to a plan that starts in junction490bool planToJunction() const;491492/// @brief return true if tag correspond to a plan that starts in busStop493bool planToBusStop() const;494495/// @brief return true if tag correspond to a plan that starts in trainStop496bool planToTrainStop() const;497498/// @brief return true if tag correspond to a plan that starts in containerStop499bool planToContainerStop() const;500501/// @brief return true if tag correspond to a plan that starts in chargingStation502bool planToChargingStation() const;503504/// @brief return true if tag correspond to a plan that starts in parkingArea505bool planToParkingArea() const;506507/// @brief return true if tag correspond to a plan that ends in stoppingPlace508bool planToStoppingPlace() const;509510/// @}511512/// @brief properties513/// @{514/// @brief return true if tag correspond to an element child of another element (Example: E3->Entry/Exit)515bool isChild() const;516517/// @brief return true if tag correspond to a symbol element518bool isSymbol() const;519520/// @brief return true if tag correspond to an internal lane521bool isInternalLane() const;522523/// @brief return true if tag correspond to a drawable element524bool isDrawable() const;525526/// @brief return true if tag correspond to a selectable element527bool isSelectable() const;528529/// @brief return true if tag correspond to an element that can use a geo shape530bool hasGEOShape() const;531532/// @brief return true if tag correspond to an element that can be edited using a dialog533bool hasDialog() const;534535/// @brief return true if tag correspond to an element that contains extended attributes536bool hasExtendedAttributes() const;537538/// @brief return true if Tag correspond to an element that supports parameters "key1=value1|key2=value2|...|keyN=valueN"539bool hasParameters() const;540541/// @brief return true if Tag correspond to an element that has to be placed in RTREE542bool isPlacedInRTree() const;543544/// @brief return true if Tag correspond to a listed element545bool isListedElement() const;546547/// @brief return true if tag correspond to an element that center camera after creation548bool canCenterCameraAfterCreation() const;549550/// @brief return true if tag correspond to an element that requires a geo projection551bool requireProj() const;552553/// @brief return true if tag correspond to an element that has vClass icons554bool vClassIcon() const;555556/// @}557558/// @brief file559/// @{560/// @brief check if the given File property is compatible with this TagProperty561bool isFileCompatible(FileBucket::Type file) const;562563/// @brief element is saved in a network file564bool saveInNetworkFile() const;565566/// @brief element is saved in an additional file567bool saveInAdditionalFile() const;568569/// @brief element is saved in a demand file570bool saveInDemandFile() const;571572/// @brief element is saved in a data file573bool saveInDataFile() const;574575/// @brief element is saved in a meanData file576bool saveInMeanDataFile() const;577578/// @brief element is saved in the parent file579bool saveInParentFile() const;580581/// @}582583protected:584/// @brief add child585void addChild(const GNETagProperties* child);586587private:588/// @brief Sumo XML Tag vinculated wit this tag Property589const SumoXMLTag myTag = SUMO_TAG_NOTHING;590591/// @brief Sumo XML Tag vinculated wit this tag Property in String format592const std::string myTagStr;593594/// @brief tag property parent595const GNETagProperties* myParent = nullptr;596597/// @brief tag property children598std::vector<const GNETagProperties*> myChildren;599600/// @brief tag Types601const Type myType = Type::OTHER;602603/// @brief tag properties604const Property myProperty = Property::NO_PROPERTY;605606/// @brief tag over607const Over myOver = Over::VIEW;608609/// @brief tag file610const FileBucket::Type myBucketType = FileBucket::Type::NOTHING;611612/// @brief conflicts613const Conflicts myConflicts = Conflicts::NO_CONFLICTS;614615/// @brief vector with the attribute values vinculated with this Tag616std::vector<const GNEAttributeProperties*> myAttributeProperties;617618/// @brief icon associated to this tag property619const GUIIcon myIcon = GUIIcon::EMPTY;620621/// @brief GUIGlObjectType associated with this tag property622const GUIGlObjectType myGLType = GUIGlObjectType::GLO_MAX;623624/// @brief Tag written in XML and used in GNENetHelper::AttributeCarriers625const SumoXMLTag myXMLTag = SUMO_TAG_NOTHING;626627/// @brief tooltip text628const std::string myTooltipText;629630/// @brief vector with XML parent tags (used by child elements like access or spaces)631const std::vector<SumoXMLTag> myXMLParentTags;632633/// @brief text show in selector text634const std::string mySelectorText;635636/// @brief background color (used in labels and textFields, by default white)637const unsigned int myBackgroundColor = 0;638639/// @brief recursive function for get all children tag properites (Including this)640void getChildrenTagProperties(const GNETagProperties* tagProperties, std::vector<const GNETagProperties*>& result) const;641642/// @brief recursive function for get all children attributes (Including this)643void getChildrenAttributes(const GNETagProperties* tagProperties, std::map<std::string, const GNEAttributeProperties*>& result, const bool onlyDrawables) const;644645/// @brief default constructor646GNETagProperties() = delete;647648/// @brief Invalidated copy constructor.649GNETagProperties(const GNETagProperties&) = delete;650651/// @brief Invalidated assignment operator652GNETagProperties& operator=(const GNETagProperties& src) = delete;653};654655/// @brief override tag parent bit operator656constexpr GNETagProperties::Type operator|(GNETagProperties::Type a, GNETagProperties::Type b) {657return static_cast<GNETagProperties::Type>(static_cast<std::uint64_t>(a) | static_cast<std::uint64_t>(b));658}659660/// @brief override tag parent bit operator661constexpr bool operator&(GNETagProperties::Type a, GNETagProperties::Type b) {662return (static_cast<std::uint64_t>(a) & static_cast<std::uint64_t>(b)) != 0;663}664665/// @brief override tag parent bit operator666constexpr GNETagProperties::Property operator|(GNETagProperties::Property a, GNETagProperties::Property b) {667return static_cast<GNETagProperties::Property>(static_cast<std::uint64_t>(a) | static_cast<std::uint64_t>(b));668}669670/// @brief override tag parent bit operator671constexpr bool operator&(GNETagProperties::Property a, GNETagProperties::Property b) {672return (static_cast<std::uint64_t>(a) & static_cast<std::uint64_t>(b)) != 0;673}674675/// @brief override tag parent bit operator676constexpr GNETagProperties::Over operator|(GNETagProperties::Over a, GNETagProperties::Over b) {677return static_cast<GNETagProperties::Over>(static_cast<std::uint64_t>(a) | static_cast<std::uint64_t>(b));678}679680/// @brief override tag parent bit operator681constexpr bool operator&(GNETagProperties::Over a, GNETagProperties::Over b) {682return (static_cast<std::uint64_t>(a) & static_cast<std::uint64_t>(b)) != 0;683}684685/// @brief override tag parent bit operator686constexpr GNETagProperties::Conflicts operator|(GNETagProperties::Conflicts a, GNETagProperties::Conflicts b) {687return static_cast<GNETagProperties::Conflicts>(static_cast<std::uint64_t>(a) | static_cast<std::uint64_t>(b));688}689690/// @brief override tag parent bit operator691constexpr bool operator&(GNETagProperties::Conflicts a, GNETagProperties::Conflicts b) {692return (static_cast<std::uint64_t>(a) & static_cast<std::uint64_t>(b)) != 0;693}694695/****************************************************************************/696697698