8 #ifndef __VRV_OBJECT_H__
9 #define __VRV_OBJECT_H__
17 #include <shared_mutex>
19 #include <unordered_set>
23 #include "attclasses.h"
24 #include "attmodule.h"
25 #include "boundingbox.h"
30 class AltSymInterface;
31 class AreaPosInterface;
33 class DurationInterface;
34 class EditorialElement;
40 class LinkingInterface;
41 class FacsimileInterface;
42 class OffsetInterface;
43 class OffsetSpanningInterface;
45 class PositionInterface;
47 class ScoreDefInterface;
48 class StemmedDrawingInterface;
49 class TextDirInterface;
50 class TimePointInterface;
51 class TimeSpanningInterface;
52 class VisibilityDrawingInterface;
55 #define UNLIMITED_DEPTH -10000
57 #define BACKWARD false
76 ClassId GetClassId()
const final {
return m_classId; }
77 virtual std::string GetClassName()
const {
return "[MISSING]"; }
86 bool IsReferenceObject()
const {
return m_isReferenceObject; }
92 bool IsFloatingObject()
const {
return (this->IsSystemElement() || this->IsControlElement()); }
107 bool IsControlElement()
const {
return Object::IsControlElement(m_classId); }
108 bool IsEditorialElement()
const {
return Object::IsEditorialElement(m_classId); }
109 bool IsLayerElement()
const {
return Object::IsLayerElement(m_classId); }
110 bool IsLyricElement()
const {
return Object::IsLyricElement(m_classId); }
111 bool IsPageElement()
const {
return Object::IsPageElement(m_classId); }
112 bool IsRunningElement()
const {
return Object::IsRunningElement(m_classId); }
113 bool IsScoreDefElement()
const {
return Object::IsScoreDefElement(m_classId); }
114 bool IsSystemElement()
const {
return Object::IsSystemElement(m_classId); }
115 bool IsTextElement()
const {
return Object::IsTextElement(m_classId); }
124 static bool IsControlElement(ClassId classId)
126 return ((classId > CONTROL_ELEMENT) && (classId < CONTROL_ELEMENT_max));
128 static bool IsEditorialElement(ClassId classId)
130 return ((classId > EDITORIAL_ELEMENT) && (classId < EDITORIAL_ELEMENT_max));
132 static bool IsLayerElement(ClassId classId) {
return ((classId > LAYER_ELEMENT) && (classId < LAYER_ELEMENT_max)); }
133 static bool IsLyricElement(ClassId classId) {
return ((classId > LYRIC_ELEMENT) && (classId < LYRIC_ELEMENT_max)); }
134 static bool IsPageElement(ClassId classId) {
return ((classId > PAGE_ELEMENT) && (classId < PAGE_ELEMENT_max)); }
135 static bool IsRunningElement(ClassId classId)
137 return ((classId > RUNNING_ELEMENT) && (classId < RUNNING_ELEMENT_max));
139 static bool IsScoreDefElement(ClassId classId)
141 return ((classId > SCOREDEF_ELEMENT) && (classId < SCOREDEF_ELEMENT_max));
143 static bool IsSystemElement(ClassId classId)
145 return ((classId > SYSTEM_ELEMENT) && (classId < SYSTEM_ELEMENT_max));
147 static bool IsTextElement(ClassId classId) {
return ((classId > TEXT_ELEMENT) && (classId < TEXT_ELEMENT_max)); }
154 void RegisterAttClass(AttClassId attClassId) { m_attClasses.push_back(attClassId); }
155 bool HasAttClass(AttClassId attClassId)
const
157 return std::find(m_attClasses.begin(), m_attClasses.end(), attClassId) != m_attClasses.end();
159 void RegisterInterface(std::vector<AttClassId> *attClasses, InterfaceId interfaceId);
160 bool HasInterface(InterfaceId interfaceId)
const
162 return std::find(m_interfaces.begin(), m_interfaces.end(), interfaceId) != m_interfaces.end();
170 virtual AltSymInterface *GetAltSymInterface() {
return NULL; }
171 virtual const AltSymInterface *GetAltSymInterface()
const {
return NULL; }
172 virtual AreaPosInterface *GetAreaPosInterface() {
return NULL; }
173 virtual const AreaPosInterface *GetAreaPosInterface()
const {
return NULL; }
174 virtual BeamDrawingInterface *GetBeamDrawingInterface() {
return NULL; }
175 virtual const BeamDrawingInterface *GetBeamDrawingInterface()
const {
return NULL; }
176 virtual DurationInterface *GetDurationInterface() {
return NULL; }
177 virtual const DurationInterface *GetDurationInterface()
const {
return NULL; }
178 virtual LinkingInterface *GetLinkingInterface() {
return NULL; }
179 virtual const LinkingInterface *GetLinkingInterface()
const {
return NULL; }
180 virtual FacsimileInterface *GetFacsimileInterface() {
return NULL; }
181 virtual const FacsimileInterface *GetFacsimileInterface()
const {
return NULL; }
182 virtual OffsetInterface *GetOffsetInterface() {
return NULL; }
183 virtual const OffsetInterface *GetOffsetInterface()
const {
return NULL; }
184 virtual OffsetSpanningInterface *GetOffsetSpanningInterface() {
return NULL; }
185 virtual const OffsetSpanningInterface *GetOffsetSpanningInterface()
const {
return NULL; }
186 virtual PitchInterface *GetPitchInterface() {
return NULL; }
187 virtual const PitchInterface *GetPitchInterface()
const {
return NULL; }
188 virtual PlistInterface *GetPlistInterface() {
return NULL; }
189 virtual const PlistInterface *GetPlistInterface()
const {
return NULL; }
190 virtual PositionInterface *GetPositionInterface() {
return NULL; }
191 virtual const PositionInterface *GetPositionInterface()
const {
return NULL; }
192 virtual ScoreDefInterface *GetScoreDefInterface() {
return NULL; }
193 virtual const ScoreDefInterface *GetScoreDefInterface()
const {
return NULL; }
194 virtual StemmedDrawingInterface *GetStemmedDrawingInterface() {
return NULL; }
195 virtual const StemmedDrawingInterface *GetStemmedDrawingInterface()
const {
return NULL; }
196 virtual TextDirInterface *GetTextDirInterface() {
return NULL; }
197 virtual const TextDirInterface *GetTextDirInterface()
const {
return NULL; }
198 virtual TimePointInterface *GetTimePointInterface() {
return NULL; }
199 virtual const TimePointInterface *GetTimePointInterface()
const {
return NULL; }
200 virtual TimeSpanningInterface *GetTimeSpanningInterface() {
return NULL; }
201 virtual const TimeSpanningInterface *GetTimeSpanningInterface()
const {
return NULL; }
202 virtual VisibilityDrawingInterface *GetVisibilityDrawingInterface() {
return NULL; }
203 virtual const VisibilityDrawingInterface *GetVisibilityDrawingInterface()
const {
return NULL; }
288 const std::string &GetID()
const {
return m_id; }
289 void SetID(
const std::string &
id) { m_id = id; }
290 void SwapID(Object *other);
297 virtual void AttributesToExternal() {};
298 virtual void AttributesToInternal() {};
305 void SetComment(std::string comment) { m_comment = comment; }
306 bool HasComment()
const {
return !m_comment.empty(); }
307 std::string GetClosingComment()
const {
return m_closingComment; }
308 void SetClosingComment(std::string endComment) { m_closingComment = endComment; }
309 bool HasClosingComment()
const {
return !m_closingComment.empty(); }
317 int GetChildCount()
const {
return (
int)m_children.size(); }
318 int GetChildCount(
const ClassId classId)
const;
319 int GetChildCount(
const ClassId classId,
int depth)
const;
320 int GetDescendantCount(
const ClassId classId)
const;
346 const ArrayOfObjects &
GetChildren() {
return m_children; }
366 int GetAttributes(ArrayOfStrAttr *attributes,
bool convertToExternal =
true)
const;
381 Object *GetFirst(
const ClassId classId = UNSPECIFIED);
382 const Object *GetFirst(
const ClassId classId = UNSPECIFIED)
const;
384 const Object *GetNext()
const;
392 Object *GetNext(
const Object *child,
const ClassId classId = UNSPECIFIED);
393 const Object *GetNext(
const Object *child,
const ClassId classId = UNSPECIFIED)
const;
394 Object *GetPrevious(
const Object *child,
const ClassId classId = UNSPECIFIED);
395 const Object *GetPrevious(
const Object *child,
const ClassId classId = UNSPECIFIED)
const;
403 const Object *
GetLast(
const ClassId classId = UNSPECIFIED)
const;
464 int GetDrawingX()
const override;
465 int GetDrawingY()
const override;
473 void ResetCachedDrawingX()
const override;
474 void ResetCachedDrawingY()
const override;
524 const std::string &
id,
int deepness = UNLIMITED_DEPTH,
bool direction = FORWARD)
const;
542 Comparison *comparison,
int deepness = UNLIMITED_DEPTH,
bool direction = FORWARD);
544 Comparison *comparison,
int deepness = UNLIMITED_DEPTH,
bool direction = FORWARD)
const;
553 Comparison *comparison,
int deepness = UNLIMITED_DEPTH,
bool direction = FORWARD);
555 Comparison *comparison,
int deepness = UNLIMITED_DEPTH,
bool direction = FORWARD)
const;
563 ClassId classId,
bool continueDepthSearchForMatches =
true,
int deepness = UNLIMITED_DEPTH);
565 ClassId classId,
bool continueDepthSearchForMatches =
true,
int deepness = UNLIMITED_DEPTH)
const;
574 bool direction = FORWARD,
bool clear =
true);
576 int deepness = UNLIMITED_DEPTH,
bool direction = FORWARD,
bool clear =
true)
const;
585 const Object *end,
bool clear =
true,
int depth = UNLIMITED_DEPTH);
587 const Object *end,
bool clear =
true,
int depth = UNLIMITED_DEPTH)
const;
647 Object *GetFirstAncestorInRange(
const ClassId classIdMin,
const ClassId classIdMax,
int maxDepth = -1);
648 const Object *GetFirstAncestorInRange(
const ClassId classIdMin,
const ClassId classIdMax,
int maxDepth = -1)
const;
688 bool IsAttribute()
const {
return m_isAttribute; }
689 void IsAttribute(
bool isAttribute) { m_isAttribute = isAttribute; }
696 bool IsExpansion()
const {
return m_isExpansion; }
697 void IsExpansion(
bool isExpansion) { m_isExpansion = isExpansion; }
720 std::stable_sort(m_children.begin(), m_children.end(), comp);
723 void ReorderByXPos();
733 bool HasPlistReferences()
const {
return static_cast<bool>(m_plistReferences); }
734 void ResetPlistReferences() { m_plistReferences.reset(); }
735 const ListOfConstObjects *GetPlistReferences()
const {
return m_plistReferences.get(); }
736 void AddPlistReference(
const Object *
object);
748 void Process(
Functor &functor,
int deepness = UNLIMITED_DEPTH,
bool skipFirst =
false);
749 void Process(
ConstFunctor &functor,
int deepness = UNLIMITED_DEPTH,
bool skipFirst =
false)
const;
758 virtual FunctorCode AcceptEnd(
Functor &functor);
759 virtual FunctorCode AcceptEnd(
ConstFunctor &functor)
const;
767 virtual std::string LogDebugTreeMsg() {
return this->GetClassName(); }
774 static void SeedID(uint32_t seed = 0);
776 static std::string GenerateHashID();
778 static uint32_t Hash(uint32_t number,
bool reverse =
false);
796 void Init(ClassId classId);
802 bool SkipChildren(
bool visibleOnly)
const;
803 bool FiltersApply(
const Filters *filters,
Object *
object)
const;
820 ArrayOfObjects m_children;
843 bool m_isReferenceObject;
851 mutable bool m_isModified;
859 mutable ArrayOfObjects::const_iterator m_iteratorEnd, m_iteratorCurrent;
860 mutable ClassId m_iteratorElementType;
866 std::vector<AttClassId> m_attClasses;
871 std::vector<InterfaceId> m_interfaces;
878 std::string m_comment;
879 std::string m_closingComment;
897 std::unique_ptr<ListOfConstObjects> m_plistReferences;
906 static thread_local
unsigned long s_objectCounter;
911 static thread_local uint32_t s_xmlIDCounter;
944 const Object *GetListFirstBackward(
const Object *startFrom,
const ClassId classId = UNSPECIFIED)
const;
945 Object *GetListFirstBackward(
const Object *startFrom,
const ClassId classId = UNSPECIFIED);
985 int GetListSize()
const;
986 const Object *GetListFront()
const;
988 const Object *GetListBack()
const;
1003 const Object *GetInterfaceOwner()
const;
1009 mutable ListOfConstObjects m_list;
1011 mutable const Object *m_owner = NULL;
1069 bool operator()(
const Object *
object)
1071 if (m_classId == UNSPECIFIED) {
1074 return (object->GetClassId() == m_classId);
1110 void Register(
const std::string &name, ClassId classId, std::function<
Object *(
void)>
function);
1125 void GetClassIds(
const std::vector<std::string> &classStrings, std::vector<ClassId> &classIds);
1128 mutable std::shared_mutex m_mutex;
1129 MapOfClassIdConstructors m_ctorsRegistry;
1130 MapOfStrClassIds m_classIdsRegistry;
This class represents a basic object in the layout domain.
Definition: boundingbox.h:32
Definition: object.h:1137
ClassRegistrar(const std::string &name, ClassId pseudoClassId, std::function< Object *()> factory)
The contructor registering the name / constructor map taking a custom factory function.
Definition: object.h:1151
ClassRegistrar(const std::string &name, ClassId classId)
The contructor registering the name / constructor map.
Definition: object.h:1142
Definition: comparison.h:32
This abstract class is the base class for all const functors.
Definition: functor.h:126
This class is used to store comparison filters and apply them when necessary.
Definition: comparison.h:613
This abstract class is the base class for all mutable functors.
Definition: functor.h:101
Unary predicate for comparing object types.
Definition: object.h:1064
Definition: object.h:1089
static ObjectFactory & GetInstance()
A static method returning a static object in order to guarantee initialisation.
void GetClassIds(const std::vector< std::string > &classStrings, std::vector< ClassId > &classIds)
Get the correspondings ClassIds from the vector of MEI element string names.
Object * Create(ClassId classId)
Create the object from the ClassId by making a lookup in the register.
ClassId GetClassId(const std::string &name)
Get the ClassId from the MEI element string name by making a lookup in the register.
void Register(const std::string &name, ClassId classId, std::function< Object *(void)> function)
Add the name / constructor map entry to the static register.
Object * Create(const std::string &name)
Create the object from the MEI element string name by making a lookup in the register.
std::string GetClassName(ClassId classId)
Get the MEI element name from the ClassId by making a lookup in the register.
This class represents a basic object.
Definition: object.h:66
Object * FindDescendantByID(const std::string &id, int deepness=UNLIMITED_DEPTH, bool direction=FORWARD)
Look for a descendant with the specified id (returns NULL if not found) This method is a wrapper for ...
void FindAllDescendantsByComparison(ListOfObjects *objects, Comparison *comparison, int deepness=UNLIMITED_DEPTH, bool direction=FORWARD, bool clear=true)
Return all the objects matching the Comparison functor Deepness allow to limit the depth search (Edit...
void ReplaceWithCopyOf(Object *object)
Replace an object with a copy of the other.
bool HasAttribute(std::string attribute, std::string value) const
Check if an Object has an attribute with the specified value.
void ClearChildren()
Clear the children vector and delete all the objects.
Object * GetFirstChildNot(const ClassId classId)
Return the first child that is NOT of the specified type.
void RotateChildren(int first, int middle, int last)
Rotates the child elements of the object leftwards, using std::rotate() with the given indices.
bool HasDescendant(const Object *child, int deepness=UNLIMITED_DEPTH) const
Return true if the object has the child Object as descendant (reference of direct).
virtual bool IsSupportedChild(ClassId classId)
Base method for checking if a child can be added.
void FillFlatList(ListOfConstObjects &list) const
Fill the list of all the children LayerElement.
virtual int GetInsertOrderFor(ClassId) const
Return the child order for a the given ClassId.
Definition: object.h:448
virtual void CloneReset()
Reset pointers after a copy and assignment constructor call.
int GetIdx() const
Return the index position of the object in its parent (-1 if not found)
Object * FindDescendantByType(ClassId classId, int deepness=UNLIMITED_DEPTH, bool direction=FORWARD)
Look for a descendant with the specified type (returns NULL if not found) This method is a wrapper fo...
void Modify(bool modified=true) const
Mark the object and its parent (if any) as modified.
bool IsFloatingObject() const
Wrapper for checking if an element is a floating object (system elements and control elements)
Definition: object.h:92
Object * GetFirstAncestor(const ClassId classId, int maxSteps=-1)
Return the first ancestor of the specified type.
Object * GetChild(int idx)
Child access (generic)
const Resources * GetDocResources() const
Resource access from the document.
Object * Relinquish(int idx)
Give up ownership of the child at the idx position (NULL if not found) This is a method to be used on...
virtual bool AddChildAdditionalCheck(Object *)
Additional check when adding a child.
Definition: object.h:441
virtual bool CopyChildren() const
Indicate whereas children have to be copied in copy / assignment constructors.
Definition: object.h:279
bool IsModified() const
Check if the content was modified or not.
Definition: object.h:677
virtual FunctorCode Accept(Functor &functor)
Interface for class functor visitation.
ListOfObjects FindAllDescendantsByType(ClassId classId, bool continueDepthSearchForMatches=true, int deepness=UNLIMITED_DEPTH)
Return all the objects with specified type.
void ResetParent()
Reset the parent of the Object.
Definition: object.h:424
void CopyAttributesTo(Object *target) const
Copy all the attributes of an obejct to target.
ArrayOfConstObjects GetChildren() const
Return the children as const reference or copy.
ArrayOfObjects & GetChildrenForModification()
Return a reference to the children that allows modification.
Definition: object.h:353
void ClearRelinquishedChildren()
Removes all the children that were previously relinquished.
Object & operator=(const Object &object)
Copy assignement - see copy constructor.
int GetDescendantIndex(const Object *child, const ClassId classId, int depth)
Look for all Objects of a class and return its position (-1 if not found)
bool IsAncestorOf(const Object *object) const
Check if the object is the ancestor of the other one.
int GetChildIndex(const Object *child) const
Look for the Object in the children and return its position (-1 if not found)
ArrayOfStrAttr m_unsupported
Keep an array of unsupported attributes as pairs.
Definition: object.h:811
Object * FindDescendantByComparison(Comparison *comparison, int deepness=UNLIMITED_DEPTH, bool direction=FORWARD)
Return the first element matching the Comparison functor Deepness allow to limit the depth search (Ed...
void SaveObject(Output *output)
Saves the object (and its children) using the specified output stream.
Object(const Object &object)
Copy constructor that also copy the children.
bool IsMilestoneElement() const
Wrapper for checking if an element has a milestone start interface and also if is set as a milestone ...
Object * GetLastAncestorNot(const ClassId classId, int maxSteps=-1)
Return the last ancestor that is NOT of the specified type.
ListOfObjects GetAncestors()
Returns all ancestors.
Object * FindDescendantExtremeByComparison(Comparison *comparison, int deepness=UNLIMITED_DEPTH, bool direction=FORWARD)
Return the element matching the extreme value with an Comparison functor Deepness allow to limit the ...
void SetAsReferenceObject()
Make an object a reference object that do not own children.
void SetParent(Object *parent)
Set the parent of the Object.
bool DeleteChild(Object *child)
Remove and delete the child.
bool(* binaryComp)(Object *, Object *)
Sort children by a function that takes two arguments and returns true if the first argument is less t...
Definition: object.h:260
Object * GetLast(const ClassId classId=UNSPECIFIED)
Return the last child of the object (if any, NULL otherwise)
void MoveChildrenFrom(Object *sourceParent, int idx=-1, bool allowTypeChange=false)
Move all the children of the object passed as parameter to this one.
std::string GetComment() const
Methods for setting / getting comments.
Definition: object.h:304
void LogDebugTree(int maxDepth=UNLIMITED_DEPTH, int level=0)
Output the class name of the object (or a custom msg) and of its children recursively.
void Process(Functor &functor, int deepness=UNLIMITED_DEPTH, bool skipFirst=false)
Main method that processes functors.
virtual Object * Clone() const
Method call for copying child classes.
virtual bool AddChild(Object *object)
Base method for adding children.
void ReplaceChild(Object *currentChild, Object *replacingChild)
Replace the currentChild with the replacingChild.
void InsertChild(Object *element, int idx)
Insert an element at the idx position.
void MoveItselfTo(Object *targetParent)
Move an object to another parent.
Object * DetachChild(int idx)
Detach the child at the idx position (NULL if not found) The parent pointer is set to NULL.
void StableSort(Compare comp)
Sort the child elements using std::stable_sort.
Definition: object.h:718
bool HasEditorialContent()
Return true if the object contains any editorial content.
int DeleteChildrenByComparison(Comparison *comparison)
Delete the children that match the comparison.
void FindAllDescendantsBetween(ListOfObjects *objects, Comparison *comparison, const Object *start, const Object *end, bool clear=true, int depth=UNLIMITED_DEPTH)
Return all the objects matching the Comparison functor and being between start and end in the tree.
virtual void Reset()
Reset the object, that is 1) removing all children and 2) resetting all attributes.
Object * GetParent()
Get the parent of the Object.
Definition: object.h:410
bool HasNonEditorialContent()
Return true if the object contains anything that is not editorial content.
static bool IsPreOrdered(const Object *left, const Object *right)
Return true if left appears before right in preorder traversal.
int GetAttributes(ArrayOfStrAttr *attributes, bool convertToExternal=true) const
Fill an array of pairs with all attributes and their values.
int GetInsertOrderForIn(ClassId classId, const std::vector< ClassId > &order) const
Find the order from an overriden GetInsertOrderFor method.
Object * GetDirectChild(Object *parent, Object *descendant)
Return reference to the object that is the ancestor of the indicated descendant object and that is a ...
This class is an pseudo interface for elements maintaining a flat list of children LayerElement for p...
Definition: object.h:925
int GetListIndex(const Object *listElement) const
Look for the Object in the list and return its position (-1 if not found)
const Object * GetListPrevious(const Object *listElement) const
Returns the previous object in the list (NULL if not found)
const Object * GetListNext(const Object *listElement) const
Returns the next object in the list (NULL if not found)
virtual void FilterList(ListOfConstObjects &) const
Filter the list for a specific class.
Definition: object.h:997
const ListOfConstObjects & GetList() const
Return the list.
const Object * GetListFirst(const Object *startFrom, const ClassId classId=UNSPECIFIED) const
Gets the first item of type elementType starting at startFrom.
void ResetList() const
Reset the list of children and call FilterList().
bool HasEmptyList() const
Convenience functions that check if the list is up-to-date If not, the list is updated before returni...
This class is a base class for output classes.
Definition: iobase.h:31
This class provides resource values.
Definition: resources.h:30
This class is an pseudo interface for elements maintaining a flat list of children LayerElement for p...
Definition: object.h:1024
std::u32string GetText() const
Returns a contatenated version of all the text children.
void FilterList(ListOfConstObjects &childList) const override
Filter the list for a specific class.
void GetTextLines(std::vector< std::u32string > &lines) const
Fill an array of lines with concatenated content of each line.