#ifndef MIRRORINGDEVICE_TYPE_HPP_INCLUDED
#define MIRRORINGDEVICE_TYPE_HPP_INCLUDED

#include <iostream>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <vector>
#include <NBO/NBO/AnnotationRef.h>
#include <NBO/NBO/Denomination_Type.h>
#include <NBO/NBO/ManufacturerSpec_Type.h>
#include <NBO/NBO/MirrorGeometry_Type.h>
#include <NBO/NBO/MirrorID_Type.h>
#include <NBO/NBO/MirrorType_Type.h>
#include <NBO/NBO/OpticalMaterialName_Type.h>
#include <NBO/NBO/UnitsAngle_Type.h>
#include <NBO/NBO/UnitsLength_Type.h>
#include <NBO/NBO/ENBOType.h>
#include <NBO/NBOGlobal.h>
#include <NBO/Shared/Base/NBOBaseClass.h>


namespace Inscoper::NBO {

/*!
* \brief Represents the XML complex type MirroringDevice.
*
* This element describes a Mirror positioned in the Light Path for one or more Channels available for this Instrument. An Instrument may have several Mirrors of different types, such as Dichroic, Beamsplitter or Reflector. This element can be associated with an optional Optics Holder, such as a Filter Cube, Filter Turret, Filter Wheel, or Filter Slider.
*/
class NBO_EXPORT MirroringDevice_Type : public ManufacturerSpec_Type {

public:
	
	MirroringDevice_Type();
	~MirroringDevice_Type();

	/*!
	* \brief Cast a NBOBaseClass to a MirroringDevice_Type.
	*
	* \param base The base class to cast
	* \return The casted element, or nullptr if the cast fails
	*/
	static std::shared_ptr<MirroringDevice_Type> fromBase(NBOBaseClassPtr base);

	/*!
	* \brief Returns the class type name.
	*
	* \return The class type name
	*/
	virtual std::string getTypeName() const override;

	/*!
	* \brief Returns the XML element name corresponding to this class.
	*
	* \return The XML element name
	*/
	std::string getXMLName() const override;

	/*!
	* \brief Returns the NBO Type corresponding to this class.
	*
	* \return The NBO Type value
	*/
	ENBOType getNBOType() const override;

	/*!
	* \brief Returns a list of all classes derived from this class.
	*
	* \return The list of derived classes
	*/
	std::vector<NBOBaseClassPtr> getChildren() const override;

	/*!
	* \brief Returns a list of all child elements contained in this class.
	*
	* \return The list of child classes
	*/
	std::vector<NBOBaseClassPtr> getSubElements() const override;

	/*!
	* \brief Populates this object from a JSON file.
	*
	* \param path The path to the JSON file
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void fromJsonFile(const std::string& path, bool validate = true);

	/*!
	* \brief Populates this object from a JSON string.
	*
	* \param json_string The JSON content as a string
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void fromJsonString(const std::string& json_string, bool validate = true);

	/*!
	* \brief Populates this object from a XML file.
	*
	* \param path The path to the XML file
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void fromXmlFile(const std::string& path, bool validate = true);

	/*!
	* \brief Populates this object from a XML string.
	*
	* \param xml_string The XML content as a string
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void fromXmlString(const std::string& xml_string, bool validate = true);

	/*!
	* \brief Serializes this object to an XML file.
	*
	* \param filename The path to the output XML file
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void toXmlFile(const std::string& filename, bool validate = true) const;

	/*!
	* \brief Serializes this object to an XML string.
	*
	* \param validate If true, validates constraints on value. Default is true.
	* \return A string containing the XML representation of this object
	*/
	std::string toXmlString(bool validate = true) const;

	/*!
	* \brief Sets the value of the ID attribute.
	*
	* A Unique Identifier for this component.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setID(const Inscoper::NBO::MirrorID_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ID attribute.
	*
	* A Unique Identifier for this component.
	*
	* \return The value of the attribute
	*/
	MirrorID_TypePtr getID() const;

	/*!
	* \brief Resets the ID attribute to an unset state.
	*
	* A Unique Identifier for this component.
	*/
	void resetID();

	/*!
	* \brief Checks whether the optional ID attribute is present.
	*
	* A Unique Identifier for this component.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasID() const;

	/*!
	* \brief Sets the value of the Name attribute.
	*
	* A User-defined Name for this component.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setName(const Inscoper::NBO::Denomination_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the Name attribute.
	*
	* A User-defined Name for this component.
	*
	* \return The value of the attribute
	*/
	Denomination_TypePtr getName() const;

	/*!
	* \brief Resets the Name attribute to an unset state.
	*
	* A User-defined Name for this component.
	*/
	void resetName();

	/*!
	* \brief Checks whether the optional Name attribute is present.
	*
	* A User-defined Name for this component.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasName() const;

	/*!
	* \brief Sets the value of the OpticsHolderPosition attribute.
	*
	* This field records the position of this Mirroring Device in a Optics Holder of any kind, such as a Slider, Turret or Wheel.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setOpticsHolderPosition(const std::string& value, bool validate = true);

	/*!
	* \brief Returns the value of the OpticsHolderPosition attribute.
	*
	* This field records the position of this Mirroring Device in a Optics Holder of any kind, such as a Slider, Turret or Wheel.
	*
	* \return The value of the attribute
	*/
	std::string getOpticsHolderPosition() const;

	/*!
	* \brief Resets the OpticsHolderPosition attribute to an unset state.
	*
	* This field records the position of this Mirroring Device in a Optics Holder of any kind, such as a Slider, Turret or Wheel.
	*/
	void resetOpticsHolderPosition();

	/*!
	* \brief Checks whether the OpticsHolderPosition attribute is present.
	*
	* This field records the position of this Mirroring Device in a Optics Holder of any kind, such as a Slider, Turret or Wheel.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasOpticsHolderPosition() const;

	/*!
	* \brief Returns the allowed values for this attribut.
	*
	* This field records the position of this Mirroring Device in a Optics Holder of any kind, such as a Slider, Turret or Wheel.
	*
	* \return The list of allowed values
	*/
	static const std::set<std::string>& getOpticsHolderPositionAllowedValues();

	/*!
	* \brief Sets the value of the MirrorType attribute.
	*
	* This field records the general category of this Mirror.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setMirrorType(const Inscoper::NBO::MirrorType_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the MirrorType attribute.
	*
	* This field records the general category of this Mirror.
	*
	* \return The value of the attribute
	*/
	MirrorType_TypePtr getMirrorType() const;

	/*!
	* \brief Resets the MirrorType attribute to an unset state.
	*
	* This field records the general category of this Mirror.
	*/
	void resetMirrorType();

	/*!
	* \brief Checks whether the optional MirrorType attribute is present.
	*
	* This field records the general category of this Mirror.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasMirrorType() const;

	/*!
	* \brief Sets the value of the Geometry attribute.
	*
	* This field records the geometrical shape of the surface(s) of this Mirror.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setGeometry(const Inscoper::NBO::MirrorGeometry_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the Geometry attribute.
	*
	* This field records the geometrical shape of the surface(s) of this Mirror.
	*
	* \return The value of the attribute
	*/
	MirrorGeometry_TypePtr getGeometry() const;

	/*!
	* \brief Resets the Geometry attribute to an unset state.
	*
	* This field records the geometrical shape of the surface(s) of this Mirror.
	*/
	void resetGeometry();

	/*!
	* \brief Checks whether the optional Geometry attribute is present.
	*
	* This field records the geometrical shape of the surface(s) of this Mirror.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasGeometry() const;

	/*!
	* \brief Sets the value of the Diameter attribute.
	*
	* This field describes the Diameter of this optical element.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setDiameter(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the Diameter attribute.
	*
	* This field describes the Diameter of this optical element.
	*
	* \return The value of the attribute
	*/
	float getDiameter() const;

	/*!
	* \brief Resets the Diameter attribute to an unset state.
	*
	* This field describes the Diameter of this optical element.
	*/
	void resetDiameter();

	/*!
	* \brief Checks whether the Diameter attribute is present.
	*
	* This field describes the Diameter of this optical element.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasDiameter() const;

	/*!
	* \brief Sets the value of the DiameterUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setDiameterUnit(const Inscoper::NBO::UnitsLength_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the DiameterUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsLength_TypePtr getDiameterUnit() const;

	/*!
	* \brief Resets the DiameterUnit attribute to an unset state.
	*
	* No description available in the XSD standard.
	*/
	void resetDiameterUnit();

	/*!
	* \brief Checks whether the optional DiameterUnit attribute is present.
	*
	* No description available in the XSD standard.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasDiameterUnit() const;

	/*!
	* \brief Sets the value of the RadiusOfCurvature attribute.
	*
	* The radius of curvature of this Mirror. A spherical lens or Mirror surface has a center of curvature located either along or decentered from the system local optical axis. The vertex of the lens surface is located on the local optical axis. The distance from the vertex to the center of curvature is the radius of curvature of the surface.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setRadiusOfCurvature(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the RadiusOfCurvature attribute.
	*
	* The radius of curvature of this Mirror. A spherical lens or Mirror surface has a center of curvature located either along or decentered from the system local optical axis. The vertex of the lens surface is located on the local optical axis. The distance from the vertex to the center of curvature is the radius of curvature of the surface.
	*
	* \return The value of the attribute
	*/
	float getRadiusOfCurvature() const;

	/*!
	* \brief Resets the RadiusOfCurvature attribute to an unset state.
	*
	* The radius of curvature of this Mirror. A spherical lens or Mirror surface has a center of curvature located either along or decentered from the system local optical axis. The vertex of the lens surface is located on the local optical axis. The distance from the vertex to the center of curvature is the radius of curvature of the surface.
	*/
	void resetRadiusOfCurvature();

	/*!
	* \brief Checks whether the RadiusOfCurvature attribute is present.
	*
	* The radius of curvature of this Mirror. A spherical lens or Mirror surface has a center of curvature located either along or decentered from the system local optical axis. The vertex of the lens surface is located on the local optical axis. The distance from the vertex to the center of curvature is the radius of curvature of the surface.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasRadiusOfCurvature() const;

	/*!
	* \brief Sets the value of the RadiusOfCurvatureUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setRadiusOfCurvatureUnit(const Inscoper::NBO::UnitsLength_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the RadiusOfCurvatureUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsLength_TypePtr getRadiusOfCurvatureUnit() const;

	/*!
	* \brief Resets the RadiusOfCurvatureUnit attribute to an unset state.
	*
	* No description available in the XSD standard.
	*/
	void resetRadiusOfCurvatureUnit();

	/*!
	* \brief Checks whether the optional RadiusOfCurvatureUnit attribute is present.
	*
	* No description available in the XSD standard.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasRadiusOfCurvatureUnit() const;

	/*!
	* \brief Sets the value of the AngleOfIncidence attribute.
	*
	* This field records the optimal angle of incidence (AOI) for this Mirror. The AOI is the angle between the optical axis of the incident light and the axis normal to the surface of the Mirror. In specular reflection AOI is by definition equal to the Angle Of Reflection (AOR).
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setAngleOfIncidence(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the AngleOfIncidence attribute.
	*
	* This field records the optimal angle of incidence (AOI) for this Mirror. The AOI is the angle between the optical axis of the incident light and the axis normal to the surface of the Mirror. In specular reflection AOI is by definition equal to the Angle Of Reflection (AOR).
	*
	* \return The value of the attribute
	*/
	float getAngleOfIncidence() const;

	/*!
	* \brief Resets the AngleOfIncidence attribute to an unset state.
	*
	* This field records the optimal angle of incidence (AOI) for this Mirror. The AOI is the angle between the optical axis of the incident light and the axis normal to the surface of the Mirror. In specular reflection AOI is by definition equal to the Angle Of Reflection (AOR).
	*/
	void resetAngleOfIncidence();

	/*!
	* \brief Checks whether the AngleOfIncidence attribute is present.
	*
	* This field records the optimal angle of incidence (AOI) for this Mirror. The AOI is the angle between the optical axis of the incident light and the axis normal to the surface of the Mirror. In specular reflection AOI is by definition equal to the Angle Of Reflection (AOR).
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasAngleOfIncidence() const;

	/*!
	* \brief Sets the value of the AngleOfIncidenceUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setAngleOfIncidenceUnit(const Inscoper::NBO::UnitsAngle_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the AngleOfIncidenceUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsAngle_TypePtr getAngleOfIncidenceUnit() const;

	/*!
	* \brief Resets the AngleOfIncidenceUnit attribute to an unset state.
	*
	* No description available in the XSD standard.
	*/
	void resetAngleOfIncidenceUnit();

	/*!
	* \brief Checks whether the optional AngleOfIncidenceUnit attribute is present.
	*
	* No description available in the XSD standard.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasAngleOfIncidenceUnit() const;

	/*!
	* \brief Returns the allowed values for this attribut.
	*
	* No description available in the XSD standard.
	*
	* \return The list of allowed values
	*/
	static const std::set<std::string>& getAngleOfIncidenceUnitAllowedValues();

	/*!
	* \brief Sets the value of the SubstrateType attribute.
	*
	* This field records the type of Substrate that is used for this Mirror. It is typically a ground and polished piece of optical glass.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setSubstrateType(const std::string& value, bool validate = true);

	/*!
	* \brief Returns the value of the SubstrateType attribute.
	*
	* This field records the type of Substrate that is used for this Mirror. It is typically a ground and polished piece of optical glass.
	*
	* \return The value of the attribute
	*/
	std::string getSubstrateType() const;

	/*!
	* \brief Resets the SubstrateType attribute to an unset state.
	*
	* This field records the type of Substrate that is used for this Mirror. It is typically a ground and polished piece of optical glass.
	*/
	void resetSubstrateType();

	/*!
	* \brief Checks whether the SubstrateType attribute is present.
	*
	* This field records the type of Substrate that is used for this Mirror. It is typically a ground and polished piece of optical glass.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasSubstrateType() const;

	/*!
	* \brief Returns the allowed values for this attribut.
	*
	* This field records the type of Substrate that is used for this Mirror. It is typically a ground and polished piece of optical glass.
	*
	* \return The list of allowed values
	*/
	static const std::set<std::string>& getSubstrateTypeAllowedValues();

	/*!
	* \brief Sets the value of the SubstrateMaterial attribute.
	*
	* This field records the chemical composition or the designation of the substrate of this Mirroring Device. The substrate is typically composed of a glass material with low autofluorescence, such as UV-grade fused silica or Borofloat.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setSubstrateMaterial(const Inscoper::NBO::OpticalMaterialName_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the SubstrateMaterial attribute.
	*
	* This field records the chemical composition or the designation of the substrate of this Mirroring Device. The substrate is typically composed of a glass material with low autofluorescence, such as UV-grade fused silica or Borofloat.
	*
	* \return The value of the attribute
	*/
	OpticalMaterialName_TypePtr getSubstrateMaterial() const;

	/*!
	* \brief Resets the SubstrateMaterial attribute to an unset state.
	*
	* This field records the chemical composition or the designation of the substrate of this Mirroring Device. The substrate is typically composed of a glass material with low autofluorescence, such as UV-grade fused silica or Borofloat.
	*/
	void resetSubstrateMaterial();

	/*!
	* \brief Checks whether the optional SubstrateMaterial attribute is present.
	*
	* This field records the chemical composition or the designation of the substrate of this Mirroring Device. The substrate is typically composed of a glass material with low autofluorescence, such as UV-grade fused silica or Borofloat.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasSubstrateMaterial() const;

	/*!
	* \brief Sets the value of the GlassCode attribute.
	*
	* If available, this field records the international Glass Code of the material that constitutes this Mirror. The Glass Code designation is based on U.S. military standard MIL-G-174, and it consists of a six-digit number specifying the glass according to its Refractive Index nd at the Fraunhofer d- (or D3-) line, and its Abbe Number Vd also taken at that line. The resulting Glass Code is the value of nd-1 rounded to three digits, followed by Vd rounded to three digits, with all decimal points ignored. For example, BK7 has nd = 1.5168 and Vd = 64.17, giving a six-digit Glass Code of 517642.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setGlassCode(const std::string& value, bool validate = true);

	/*!
	* \brief Returns the value of the GlassCode attribute.
	*
	* If available, this field records the international Glass Code of the material that constitutes this Mirror. The Glass Code designation is based on U.S. military standard MIL-G-174, and it consists of a six-digit number specifying the glass according to its Refractive Index nd at the Fraunhofer d- (or D3-) line, and its Abbe Number Vd also taken at that line. The resulting Glass Code is the value of nd-1 rounded to three digits, followed by Vd rounded to three digits, with all decimal points ignored. For example, BK7 has nd = 1.5168 and Vd = 64.17, giving a six-digit Glass Code of 517642.
	*
	* \return The value of the attribute
	*/
	std::string getGlassCode() const;

	/*!
	* \brief Resets the GlassCode attribute to an unset state.
	*
	* If available, this field records the international Glass Code of the material that constitutes this Mirror. The Glass Code designation is based on U.S. military standard MIL-G-174, and it consists of a six-digit number specifying the glass according to its Refractive Index nd at the Fraunhofer d- (or D3-) line, and its Abbe Number Vd also taken at that line. The resulting Glass Code is the value of nd-1 rounded to three digits, followed by Vd rounded to three digits, with all decimal points ignored. For example, BK7 has nd = 1.5168 and Vd = 64.17, giving a six-digit Glass Code of 517642.
	*/
	void resetGlassCode();

	/*!
	* \brief Checks whether the GlassCode attribute is present.
	*
	* If available, this field records the international Glass Code of the material that constitutes this Mirror. The Glass Code designation is based on U.S. military standard MIL-G-174, and it consists of a six-digit number specifying the glass according to its Refractive Index nd at the Fraunhofer d- (or D3-) line, and its Abbe Number Vd also taken at that line. The resulting Glass Code is the value of nd-1 rounded to three digits, followed by Vd rounded to three digits, with all decimal points ignored. For example, BK7 has nd = 1.5168 and Vd = 64.17, giving a six-digit Glass Code of 517642.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasGlassCode() const;

	/*!
	* \brief Returns the allowed values for this attribut.
	*
	* If available, this field records the international Glass Code of the material that constitutes this Mirror. The Glass Code designation is based on U.S. military standard MIL-G-174, and it consists of a six-digit number specifying the glass according to its Refractive Index nd at the Fraunhofer d- (or D3-) line, and its Abbe Number Vd also taken at that line. The resulting Glass Code is the value of nd-1 rounded to three digits, followed by Vd rounded to three digits, with all decimal points ignored. For example, BK7 has nd = 1.5168 and Vd = 64.17, giving a six-digit Glass Code of 517642.
	*
	* \return The list of allowed values
	*/
	static const std::set<std::string>& getGlassCodeAllowedValues();

	/*!
	* \brief Sets the value of the AnnotationRef element.
	*
	* No description available in the XSD standard.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setAnnotationRef(const Inscoper::NBO::AnnotationRefPtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the AnnotationRef element.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the element
	*/
	Inscoper::NBO::AnnotationRefPtr getAnnotationRef() const;

	/*!
	* \brief Resets the AnnotationRef element to an unset state.
	*
	* No description available in the XSD standard.
	*/
	void resetAnnotationRef();

	/*!
	* \brief Checks whether the optional AnnotationRef element is present.
	*
	* No description available in the XSD standard.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasAnnotationRef() const;


private:
	class Impl;
	std::unique_ptr<Impl> pImpl;

	MirrorID_TypePtr ID = nullptr; // Required attribute
	Denomination_TypePtr Name = nullptr; // Optional attribute
    std::optional<std::string> OpticsHolderPosition; // Optional attribute
    static const std::set<std::string> OpticsHolderPositionAllowedValues;
	MirrorType_TypePtr MirrorType = nullptr; // Required attribute
	MirrorGeometry_TypePtr Geometry = nullptr; // Optional attribute
    std::optional<float> Diameter; // Optional attribute
	UnitsLength_TypePtr DiameterUnit = nullptr; // Optional attribute
    std::optional<float> RadiusOfCurvature; // Optional attribute
	UnitsLength_TypePtr RadiusOfCurvatureUnit = nullptr; // Optional attribute
    std::optional<float> AngleOfIncidence; // Optional attribute
	UnitsAngle_TypePtr AngleOfIncidenceUnit = nullptr; // Optional attribute
    static const std::set<std::string> AngleOfIncidenceUnitAllowedValues;
    std::optional<std::string> SubstrateType; // Optional attribute
    static const std::set<std::string> SubstrateTypeAllowedValues;
	OpticalMaterialName_TypePtr SubstrateMaterial = nullptr; // Optional attribute
    std::optional<std::string> GlassCode; // Optional attribute
    static const std::set<std::string> GlassCodeAllowedValues;
    Inscoper::NBO::AnnotationRefPtr AnnotationRef = nullptr;
};

/*! Shared pointer for MirroringDevice_Type*/
typedef std::shared_ptr<MirroringDevice_Type> MirroringDevice_TypePtr;

} // namespace Inscoper::NBO

#endif // MIRRORINGDEVICE_TYPE_HPP_INCLUDED