28#include <unordered_set> 
   31#include "musx/dom/Fundamentals.h" 
   32#include "musx/xml/XmlInterface.h" 
   33#include "musx/util/Logger.h" 
   34#include "MusxInstance.h" 
   50    using std::runtime_error::runtime_error;
 
 
   59#ifndef DOXYGEN_SHOULD_IGNORE_THIS 
   60class PartContextCloner {
 
   63    static void setRequestedPartId(
const std::shared_ptr<T>& obj, 
Cmper partId)
 
   65        obj->setRequestedPartId(partId);
 
   69    static std::shared_ptr<T> copyWithPartId(
const std::shared_ptr<const T>& obj, 
Cmper partId)
 
   71        auto result = std::make_shared<T>(*obj);
 
   72        setRequestedPartId(result, partId);
 
  101    virtual ~Base() noexcept(false) = default;
 
  110        auto document = m_document.lock();
 
  111        MUSX_ASSERT_IF(!document) {
 
  112            throw std::logic_error(
"Document pointer is no longer valid.");
 
 
  141        m_unlinkedNodes.insert(nodeName);
 
 
  154    virtual void integrityCheck([[maybe_unused]]
const std::shared_ptr<Base>& ptrToThis) { }
 
  177        : m_document(document), m_sourcePartId(partId), m_shareMode(shareMode) {}
 
 
  189    const Cmper m_sourcePartId;
 
 
  201    Cmper getSourcePartId() 
const = 
delete; 
 
 
  225    Cmper getSourcePartId() 
const = 
delete; 
 
  238    template <
typename ParentClass = Base>
 
  241        auto result = m_parent.lock();
 
  242        MUSX_ASSERT_IF (!result) {
 
  243            throw std::logic_error(
"Attempt to get parent of contained class, but the parent is no longer allocated.");
 
  245        if constexpr (std::is_same_v<Base, ParentClass>) {
 
  248            return std::dynamic_pointer_cast<const ParentClass>(result);
 
 
 
  262    Cmper getSourcePartId() 
const = 
delete; 
 
  273        : 
Base(document, partId, shareMode) {}
 
 
 
  285    void setRequestedPartId(
Cmper newValue) { m_requestedPartId = newValue; }
 
  287    friend class PartContextCloner; 
 
  300        : 
Base(document, partId, shareMode), m_requestedPartId(partId), m_cmper(cmper), m_inci(inci) {}
 
 
  305        if (
this != &other) {
 
 
  313        if (
this != &other) {
 
 
  335    std::optional<Inci> 
getInci()
 const { 
return m_inci; }
 
  343    Cmper m_requestedPartId{};      
 
  345    std::optional<Inci> m_inci;     
 
 
  351template <
typename ElementType, 
size_t REQUIRED_SIZE = 0>
 
  355    virtual std::string_view xmlTag() 
const = 0;
 
  360        : 
OthersBase(document, partId, shareMode, cmper)
 
 
  371        const auto& v = this->
values;
 
  372        return std::find(v.begin(), v.end(), value) != v.end();
 
 
  379        if constexpr (REQUIRED_SIZE > 0) {
 
  380            const size_t originalSize = 
values.size();
 
  381            values.resize(REQUIRED_SIZE); 
 
  382            if (originalSize < REQUIRED_SIZE) {
 
  383                MUSX_INTEGRITY_ERROR(
"Array with xml tag " + std::string(xmlTag()) + 
" and cmper " + std::to_string(
getCmper())
 
  384                    + 
" has fewer than " + std::to_string(REQUIRED_SIZE) + 
" elements.");
 
 
 
  399        : 
OthersBase(document, partId, shareMode, cmper)
 
 
 
  417    void setRequestedPartId(
Cmper newValue) { m_requestedPartId = newValue; }
 
  419    friend class PartContextCloner; 
 
  433        : 
Base(document, partId, shareMode), m_requestedPartId(partId), m_cmper1(cmper1), m_cmper2(cmper2), m_inci(inci) {}
 
 
  438        if (
this != &other) {
 
 
  446        if (
this != &other) {
 
 
  469    std::optional<Inci> 
getInci()
 const { 
return m_inci; }
 
  477    Cmper m_requestedPartId{};      
 
  480    std::optional<Inci> m_inci;     
 
 
  515template <
typename ElementType, 
size_t REQUIRED_SIZE = 0>
 
  519    virtual std::string_view xmlTag() 
const = 0;
 
  524        : 
DetailsBase(document, partId, shareMode, cmper1, cmper2)
 
 
  535        if constexpr (REQUIRED_SIZE > 0) {
 
  536            const size_t originalSize = 
values.size();
 
  537            values.resize(REQUIRED_SIZE); 
 
  538            if (originalSize < REQUIRED_SIZE) {
 
  539                MUSX_INTEGRITY_ERROR(
"Array with xml tag " + std::string(xmlTag()) + 
" and cmpers [" + std::to_string(
getCmper1()) + 
", " + std::to_string(
getCmper2())
 
  540                    + 
"] has fewer than " + std::to_string(REQUIRED_SIZE) + 
" elements.");
 
 
 
  566    Cmper getSourcePartId() 
const = 
delete; 
 
  578        : 
Base(document, partId, shareMode), m_textNumber(textNumber) {}
 
 
 
 
Base class to enforce polymorphism across all DOM classes.
Definition BaseClasses.h:83
 
DocumentPtr getDocument() const
Gets a reference to the Document.
Definition BaseClasses.h:108
 
virtual bool requireAllFields() const
Specifies if the parser should alert (print or throw) when an unknown xml tag is found for this class...
Definition BaseClasses.h:166
 
Cmper getSourcePartId() const
Gets the source partId for this instance. If an instance is fully shared with the score,...
Definition BaseClasses.h:124
 
Base & operator=(const Base &)
no-op copy assignment operator allows subclasses to copy their values.
Definition BaseClasses.h:183
 
Base(const DocumentWeakPtr &document, Cmper partId, ShareMode shareMode)
Constructs the base class.
Definition BaseClasses.h:176
 
ShareMode getShareMode() const
Gets the sharing mode for this instance.
Definition BaseClasses.h:129
 
std::set< std::string > SharedNodes
The container type for shared nodes.
Definition BaseClasses.h:86
 
Base & operator=(Base &&) noexcept
no-op move assignment operator allows subclasses to move their values.
Definition BaseClasses.h:185
 
const SharedNodes & getUnlinkedNodes() const
Gets the unlinked nodes for this instance. (Only populated for ShareMode::Partial)
Definition BaseClasses.h:134
 
virtual void integrityCheck(const std::shared_ptr< Base > &ptrToThis)
Allows a class to determine if it has been properly contructed by the factory and fix issues that it ...
Definition BaseClasses.h:154
 
void addUnlinkedNode(const std::string &nodeName)
Adds a shared node for this instance.
Definition BaseClasses.h:139
 
ShareMode
Describes how this instance is shared between part and score.
Definition BaseClasses.h:91
 
virtual ~Base() noexcept(false)=default
Virtual destructor for polymorphic behavior.
 
Base(const Base &)=default
explicit default copy constructor
 
Base(Base &&) noexcept=default
explicit default move constructor
 
Base class for classes that are commonly used among others, details, entries, and/or texts....
Definition BaseClasses.h:200
 
CommonClassBase(const DocumentWeakPtr &document)
Constructs a CommonClassBase object.
Definition BaseClasses.h:209
 
Base class for classes that are contained by other classes.
Definition BaseClasses.h:224
 
ContainedClassBase(const MusxInstance< Base > &parent)
Constructs a ContainedClassBase object.
Definition BaseClasses.h:233
 
MusxInstance< ParentClass > getParent() const
Get the parent.
Definition BaseClasses.h:239
 
Template pattern for DetailsBase items consisting of an array of a single item.
Definition BaseClasses.h:517
 
void integrityCheck(const std::shared_ptr< Base > &ptrToThis) override
Override of Base::integrityCheck.
Definition BaseClasses.h:532
 
DetailsArray(const DocumentWeakPtr &document, Cmper partId, ShareMode shareMode, Cmper cmper1, Cmper cmper2)
Constructor function.
Definition BaseClasses.h:523
 
std::vector< ElementType > values
Definition BaseClasses.h:528
 
Base class for all "details" types.
Definition BaseClasses.h:415
 
DetailsBase & operator=(const DetailsBase &other)
Assignment operator delegates to base, preserving OthersBase state.
Definition BaseClasses.h:436
 
DetailsBase(const DocumentWeakPtr &document, Cmper partId, ShareMode shareMode, Cmper cmper1, Cmper cmper2, std::optional< Inci > inci=std::nullopt)
Constructs a DetailsBase object.
Definition BaseClasses.h:432
 
DetailsBase(DetailsBase &&) noexcept=default
explicit default move constructor
 
Cmper getCmper1() const
Gets the cmper1 key value.
Definition BaseClasses.h:459
 
DetailsBase(const DetailsBase &)=default
explicit default copy constructor
 
DetailsBase & operator=(DetailsBase &&other) noexcept
Assignment operator delegates to base, preserving OthersBase state.
Definition BaseClasses.h:444
 
Cmper getRequestedPartId() const
If this instance was retrieved from an object pool, it contains the part ID that was used to retrieve...
Definition BaseClasses.h:474
 
Cmper getCmper2() const
Gets the cmper2 key value.
Definition BaseClasses.h:464
 
std::optional< Inci > getInci() const
Gets the optional array index (inci).
Definition BaseClasses.h:469
 
Represents a document object that encapsulates the entire EnigmaXML structure.
Definition Document.h:67
 
Base class for all "details" types that use entnum rather than cmper and cmper.
Definition BaseClasses.h:487
 
EntryDetailsBase(const DocumentWeakPtr &document, Cmper partId, ShareMode shareMode, EntryNumber entnum, std::optional< Inci > inci=std::nullopt)
Constructs a EntryDetailsBase object.
Definition BaseClasses.h:498
 
EntryNumber getEntryNumber() const
Gets the entnum key value.
Definition BaseClasses.h:505
 
Represents the default font settings for a particular element type.
Definition CommonClasses.h:124
 
Base class note details. Note details are entry details associated with a note ID.
Definition BaseClasses.h:548
 
virtual NoteNumber getNoteId() const =0
Required virtual function that returns the note id.
 
Base class for all "options" types.
Definition BaseClasses.h:261
 
OptionsBase(const DocumentWeakPtr &document, Cmper partId, ShareMode shareMode)
Constructs the OptionsBase and validates XmlNodeName in the derived class.
Definition BaseClasses.h:272
 
Template pattern for OthersBase items consisting of an array of a single item.
Definition BaseClasses.h:353
 
void integrityCheck(const std::shared_ptr< Base > &ptrToThis) override
Override of Base::integrityCheck.
Definition BaseClasses.h:376
 
std::vector< ElementType > values
Definition BaseClasses.h:364
 
OthersArray(const DocumentWeakPtr &document, Cmper partId, ShareMode shareMode, Cmper cmper)
Constructor function.
Definition BaseClasses.h:359
 
bool containsValue(const ElementType &value) const noexcept
Returns true if the array contains the specified value.
Definition BaseClasses.h:369
 
Base class for all "others" types.
Definition BaseClasses.h:283
 
OthersBase & operator=(OthersBase &&other) noexcept
Assignment operator delegates to base, preserving OthersBase state.
Definition BaseClasses.h:311
 
OthersBase & operator=(const OthersBase &other)
Assignment operator delegates to base, preserving OthersBase state.
Definition BaseClasses.h:303
 
Cmper getRequestedPartId() const
If this instance was retrieved from an object pool, it contains the part ID that was used to retrieve...
Definition BaseClasses.h:340
 
std::optional< Inci > getInci() const
Gets the optional array index (inci).
Definition BaseClasses.h:335
 
OthersBase(OthersBase &&) noexcept=default
explicit default move constructor
 
OthersBase(const DocumentWeakPtr &document, Cmper partId, ShareMode shareMode, Cmper cmper, std::optional< Inci > inci=std::nullopt)
Constructs an OthersBase object.
Definition BaseClasses.h:299
 
Cmper getCmper() const
Gets the cmper key value.
Definition BaseClasses.h:328
 
OthersBase(const OthersBase &)=default
explicit default copy constructor
 
Many element names are embedded directly in top-level xml tags. This encapsulates that pattern.
Definition BaseClasses.h:395
 
static const xml::XmlElementArray< OthersName > & xmlMappingArray()
Required for musx::factory::FieldPopulator.
 
OthersName(const DocumentWeakPtr &document, Cmper partId, ShareMode shareMode, Cmper cmper)
Constructor function.
Definition BaseClasses.h:398
 
std::string name
the name
Definition BaseClasses.h:403
 
Base class for all text blocks.
Definition BaseClasses.h:565
 
Cmper getTextNumber() const
Returns the raw text number.
Definition BaseClasses.h:585
 
util::EnigmaParsingContext getRawTextCtx(const MusxInstance< TextsBase > &ptrToThis, Cmper forPartId, std::optional< Cmper > forPageId=std::nullopt, util::EnigmaString::TextInsertCallback defaultInsertFunc=util::EnigmaString::defaultInsertsCallback) const
Gets the raw text block.
Definition Texts.cpp:36
 
std::string text
Raw Enigma string (with Enigma string tags), encoded UTF-8.
Definition BaseClasses.h:580
 
TextsBase(const DocumentWeakPtr &document, Cmper partId, ShareMode shareMode, Cmper textNumber)
Constructs a TextsBase object.
Definition BaseClasses.h:577
 
void setTextNumber(Cmper textNumber)
Sets the raw text number.
Definition BaseClasses.h:590
 
Exception for integrity errors. (Used when MUSX_THROW_ON_INTEGRITY_CHECK_FAIL is defined....
Definition BaseClasses.h:48
 
Wrapper class for interpreting and rendering Enigma-style strings with insert handling.
Definition EnigmaString.h:423
 
static TextInsertCallback defaultInsertsCallback
Inserts callback to take all default insert subsitutions determined by parseEnigmaText.
Definition EnigmaString.h:347
 
std::function< std::optional< std::string >(const std::vector< std::string > &parsedCommand)> TextInsertCallback
Iteration function type that the parser calls back when it encounters an Enigma text insert that requ...
Definition EnigmaString.h:344
 
std::shared_ptr< const T > MusxInstance
Defines the type of a musx instance stored in a pool.
Definition MusxInstance.h:35
 
constexpr Cmper SCORE_PARTID
The part id of the score.
Definition Fundamentals.h:79
 
uint16_t Cmper
Enigma "comperator" key type.
Definition Fundamentals.h:55
 
std::weak_ptr< Document > DocumentWeakPtr
Shared weak Document pointer.
Definition BaseClasses.h:57
 
int32_t EntryNumber
Entry identifier.
Definition Fundamentals.h:69
 
uint16_t NoteNumber
Note identifier.
Definition Fundamentals.h:70
 
std::shared_ptr< Document > DocumentPtr
Shared Document pointer.
Definition BaseClasses.h:55
 
std::weak_ptr< const T > MusxInstanceWeak
Defines a weak ptr to the type of a musx instance stored in a pool.
Definition MusxInstance.h:40
 
std::vector< XmlElementDescriptor< T > > XmlElementArray
an array type for XmlElementDescriptor instances.
Definition XmlInterface.h:127
 
object model for musx file (enigmaxml)
Definition BaseClasses.h:36