#ifndef ELECTROOPTICALDEVICE_TYPE_HPP_INCLUDED
#define ELECTROOPTICALDEVICE_TYPE_HPP_INCLUDED

#include <iostream>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <vector>
#include <NBO/NBO/AnnotationRef.h>
#include <NBO/NBO/AttenuationMethodType_Type.h>
#include <NBO/NBO/Denomination_Type.h>
#include <NBO/NBO/ElectroOpticalDeviceID_Type.h>
#include <NBO/NBO/ManufacturerSpec_Type.h>
#include <NBO/NBO/ModulationModeList_Type.h>
#include <NBO/NBO/PercentFraction_Type.h>
#include <NBO/NBO/UnitsAngle_Type.h>
#include <NBO/NBO/UnitsLength_Type.h>
#include <NBO/NBO/UnitsTemperature_Type.h>
#include <NBO/NBO/UnitsTime_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 ElectroOpticalDevice.
*
* This is is a device which can be used for controlling the power (→ intensity modulators), phase (→ phase modulators) or polarization of light with an electrical control signal. It typically contains one or two Pockels cells, and possibly additional optical elements such as polarizers.
*/
class NBO_EXPORT ElectroOpticalDevice_Type : public ManufacturerSpec_Type {

public:
	
	ElectroOpticalDevice_Type();
	~ElectroOpticalDevice_Type();

	/*!
	* \brief Cast a NBOBaseClass to a ElectroOpticalDevice_Type.
	*
	* \param base The base class to cast
	* \return The casted element, or nullptr if the cast fails
	*/
	static std::shared_ptr<ElectroOpticalDevice_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::ElectroOpticalDeviceID_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
	*/
	ElectroOpticalDeviceID_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 ModulationMode attribute.
	*
	* This field records the describes the type of modulation this devices produces on a beam of light.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setModulationMode(const Inscoper::NBO::ModulationModeList_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ModulationMode attribute.
	*
	* This field records the describes the type of modulation this devices produces on a beam of light.
	*
	* \return The value of the attribute
	*/
	ModulationModeList_TypePtr getModulationMode() const;

	/*!
	* \brief Resets the ModulationMode attribute to an unset state.
	*
	* This field records the describes the type of modulation this devices produces on a beam of light.
	*/
	void resetModulationMode();

	/*!
	* \brief Checks whether the optional ModulationMode attribute is present.
	*
	* This field records the describes the type of modulation this devices produces on a beam of light.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasModulationMode() const;

	/*!
	* \brief Sets the value of the ContrastRatio attribute.
	*
	* This field records the reports on the ratio of maximum versus minimum transmittance.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setContrastRatio(const Inscoper::NBO::PercentFraction_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ContrastRatio attribute.
	*
	* This field records the reports on the ratio of maximum versus minimum transmittance.
	*
	* \return The value of the attribute
	*/
	PercentFraction_TypePtr getContrastRatio() const;

	/*!
	* \brief Resets the ContrastRatio attribute to an unset state.
	*
	* This field records the reports on the ratio of maximum versus minimum transmittance.
	*/
	void resetContrastRatio();

	/*!
	* \brief Checks whether the optional ContrastRatio attribute is present.
	*
	* This field records the reports on the ratio of maximum versus minimum transmittance.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasContrastRatio() const;

	/*!
	* \brief Sets the value of the Coating attribute.
	*
	* An optical Coating consists of one or more thin layers of material deposited on an optical component such as a Lens or Mirror, which alters the way in which the optic reflects and transmits light. This field records the thin-film material used to coat the non linear crystal and reduce surface reflection.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setCoating(const std::string& value, bool validate = true);

	/*!
	* \brief Returns the value of the Coating attribute.
	*
	* An optical Coating consists of one or more thin layers of material deposited on an optical component such as a Lens or Mirror, which alters the way in which the optic reflects and transmits light. This field records the thin-film material used to coat the non linear crystal and reduce surface reflection.
	*
	* \return The value of the attribute
	*/
	std::string getCoating() const;

	/*!
	* \brief Resets the Coating attribute to an unset state.
	*
	* An optical Coating consists of one or more thin layers of material deposited on an optical component such as a Lens or Mirror, which alters the way in which the optic reflects and transmits light. This field records the thin-film material used to coat the non linear crystal and reduce surface reflection.
	*/
	void resetCoating();

	/*!
	* \brief Checks whether the Coating attribute is present.
	*
	* An optical Coating consists of one or more thin layers of material deposited on an optical component such as a Lens or Mirror, which alters the way in which the optic reflects and transmits light. This field records the thin-film material used to coat the non linear crystal and reduce surface reflection.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasCoating() const;

	/*!
	* \brief Returns the allowed values for this attribut.
	*
	* An optical Coating consists of one or more thin layers of material deposited on an optical component such as a Lens or Mirror, which alters the way in which the optic reflects and transmits light. This field records the thin-film material used to coat the non linear crystal and reduce surface reflection.
	*
	* \return The list of allowed values
	*/
	static const std::set<std::string>& getCoatingAllowedValues();

	/*!
	* \brief Sets the value of the AttenuationMethod attribute.
	*
	* This field records the mean by which this optical element achieves out-of-band transmission attenuation.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setAttenuationMethod(const Inscoper::NBO::AttenuationMethodType_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the AttenuationMethod attribute.
	*
	* This field records the mean by which this optical element achieves out-of-band transmission attenuation.
	*
	* \return The value of the attribute
	*/
	AttenuationMethodType_TypePtr getAttenuationMethod() const;

	/*!
	* \brief Resets the AttenuationMethod attribute to an unset state.
	*
	* This field records the mean by which this optical element achieves out-of-band transmission attenuation.
	*/
	void resetAttenuationMethod();

	/*!
	* \brief Checks whether the optional AttenuationMethod attribute is present.
	*
	* This field records the mean by which this optical element achieves out-of-band transmission attenuation.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasAttenuationMethod() const;

	/*!
	* \brief Sets the value of the AttenuationCoefficient attribute.
	*
	* This field records the Attenuation Coefficient (AC) of this optical element. The AC (aka blocking coefficient) is a material property that characterizes the degree to which light is being blocked (i.e., scattered or absorbed) by it. AC is used as a measure of the out-of-band blocking of an optical Lens, Filter, Dichroic mirror over an extended range of the spectrum. AC is often reported in units of optical density (OD), whereas OD= -log10(T), and T=Transmittance (0≤T≤1).
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setAttenuationCoefficient(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the AttenuationCoefficient attribute.
	*
	* This field records the Attenuation Coefficient (AC) of this optical element. The AC (aka blocking coefficient) is a material property that characterizes the degree to which light is being blocked (i.e., scattered or absorbed) by it. AC is used as a measure of the out-of-band blocking of an optical Lens, Filter, Dichroic mirror over an extended range of the spectrum. AC is often reported in units of optical density (OD), whereas OD= -log10(T), and T=Transmittance (0≤T≤1).
	*
	* \return The value of the attribute
	*/
	float getAttenuationCoefficient() const;

	/*!
	* \brief Resets the AttenuationCoefficient attribute to an unset state.
	*
	* This field records the Attenuation Coefficient (AC) of this optical element. The AC (aka blocking coefficient) is a material property that characterizes the degree to which light is being blocked (i.e., scattered or absorbed) by it. AC is used as a measure of the out-of-band blocking of an optical Lens, Filter, Dichroic mirror over an extended range of the spectrum. AC is often reported in units of optical density (OD), whereas OD= -log10(T), and T=Transmittance (0≤T≤1).
	*/
	void resetAttenuationCoefficient();

	/*!
	* \brief Checks whether the AttenuationCoefficient attribute is present.
	*
	* This field records the Attenuation Coefficient (AC) of this optical element. The AC (aka blocking coefficient) is a material property that characterizes the degree to which light is being blocked (i.e., scattered or absorbed) by it. AC is used as a measure of the out-of-band blocking of an optical Lens, Filter, Dichroic mirror over an extended range of the spectrum. AC is often reported in units of optical density (OD), whereas OD= -log10(T), and T=Transmittance (0≤T≤1).
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasAttenuationCoefficient() const;

	/*!
	* \brief Sets the value of the TuningAccuracy attribute.
	*
	* This field measures the accuracy with which the wavelength discriminating capacity of this device can be tuned or changed.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setTuningAccuracy(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the TuningAccuracy attribute.
	*
	* This field measures the accuracy with which the wavelength discriminating capacity of this device can be tuned or changed.
	*
	* \return The value of the attribute
	*/
	float getTuningAccuracy() const;

	/*!
	* \brief Resets the TuningAccuracy attribute to an unset state.
	*
	* This field measures the accuracy with which the wavelength discriminating capacity of this device can be tuned or changed.
	*/
	void resetTuningAccuracy();

	/*!
	* \brief Checks whether the TuningAccuracy attribute is present.
	*
	* This field measures the accuracy with which the wavelength discriminating capacity of this device can be tuned or changed.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasTuningAccuracy() const;

	/*!
	* \brief Sets the value of the TuningAccuracyUnit 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 setTuningAccuracyUnit(const Inscoper::NBO::UnitsLength_TypePtr& value, bool validate = true);

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

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

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

	/*!
	* \brief Sets the value of the TuningResolution attribute.
	*
	* This field measures the wavelength discriminating capacity of this device and it is defined as the full width at half-maximum (FWHM) of the main lobe from the selected optical output, and is a function of both wavelength and device configuration.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setTuningResolution(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the TuningResolution attribute.
	*
	* This field measures the wavelength discriminating capacity of this device and it is defined as the full width at half-maximum (FWHM) of the main lobe from the selected optical output, and is a function of both wavelength and device configuration.
	*
	* \return The value of the attribute
	*/
	float getTuningResolution() const;

	/*!
	* \brief Resets the TuningResolution attribute to an unset state.
	*
	* This field measures the wavelength discriminating capacity of this device and it is defined as the full width at half-maximum (FWHM) of the main lobe from the selected optical output, and is a function of both wavelength and device configuration.
	*/
	void resetTuningResolution();

	/*!
	* \brief Checks whether the TuningResolution attribute is present.
	*
	* This field measures the wavelength discriminating capacity of this device and it is defined as the full width at half-maximum (FWHM) of the main lobe from the selected optical output, and is a function of both wavelength and device configuration.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasTuningResolution() const;

	/*!
	* \brief Sets the value of the TuningResolutionUnit 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 setTuningResolutionUnit(const Inscoper::NBO::UnitsLength_TypePtr& value, bool validate = true);

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

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

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

	/*!
	* \brief Sets the value of the TuningRate attribute.
	*
	* This field records the time it takes for this device to be tuned without degrading resolution. This time is determined by the velocity of the acoustic wage as it traverses the aperture of this device.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setTuningRate(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the TuningRate attribute.
	*
	* This field records the time it takes for this device to be tuned without degrading resolution. This time is determined by the velocity of the acoustic wage as it traverses the aperture of this device.
	*
	* \return The value of the attribute
	*/
	float getTuningRate() const;

	/*!
	* \brief Resets the TuningRate attribute to an unset state.
	*
	* This field records the time it takes for this device to be tuned without degrading resolution. This time is determined by the velocity of the acoustic wage as it traverses the aperture of this device.
	*/
	void resetTuningRate();

	/*!
	* \brief Checks whether the TuningRate attribute is present.
	*
	* This field records the time it takes for this device to be tuned without degrading resolution. This time is determined by the velocity of the acoustic wage as it traverses the aperture of this device.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasTuningRate() const;

	/*!
	* \brief Sets the value of the TuningRateUnit 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 setTuningRateUnit(const Inscoper::NBO::UnitsTime_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the TuningRateUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsTime_TypePtr getTuningRateUnit() const;

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

	/*!
	* \brief Checks whether the optional TuningRateUnit attribute is present.
	*
	* No description available in the XSD standard.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasTuningRateUnit() 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 Sets the value of the AngularAperture attribute.
	*
	* This field records the angular aperture is the half-angle of the cone of light entering the this device. It is, therefore, a measure of how much of the incident light actually passes through the device.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setAngularAperture(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the AngularAperture attribute.
	*
	* This field records the angular aperture is the half-angle of the cone of light entering the this device. It is, therefore, a measure of how much of the incident light actually passes through the device.
	*
	* \return The value of the attribute
	*/
	float getAngularAperture() const;

	/*!
	* \brief Resets the AngularAperture attribute to an unset state.
	*
	* This field records the angular aperture is the half-angle of the cone of light entering the this device. It is, therefore, a measure of how much of the incident light actually passes through the device.
	*/
	void resetAngularAperture();

	/*!
	* \brief Checks whether the AngularAperture attribute is present.
	*
	* This field records the angular aperture is the half-angle of the cone of light entering the this device. It is, therefore, a measure of how much of the incident light actually passes through the device.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasAngularAperture() const;

	/*!
	* \brief Sets the value of the AngularApertureUnit 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 setAngularApertureUnit(const Inscoper::NBO::UnitsAngle_TypePtr& value, bool validate = true);

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

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

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

	/*!
	* \brief Sets the value of the OperatingTemperature attribute.
	*
	* This field records the ambient temperature at which this device is designed to operate, according to the Manufacturer.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setOperatingTemperature(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the OperatingTemperature attribute.
	*
	* This field records the ambient temperature at which this device is designed to operate, according to the Manufacturer.
	*
	* \return The value of the attribute
	*/
	float getOperatingTemperature() const;

	/*!
	* \brief Resets the OperatingTemperature attribute to an unset state.
	*
	* This field records the ambient temperature at which this device is designed to operate, according to the Manufacturer.
	*/
	void resetOperatingTemperature();

	/*!
	* \brief Checks whether the OperatingTemperature attribute is present.
	*
	* This field records the ambient temperature at which this device is designed to operate, according to the Manufacturer.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasOperatingTemperature() const;

	/*!
	* \brief Sets the value of the OperatingTemperatureUnit 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 setOperatingTemperatureUnit(const Inscoper::NBO::UnitsTemperature_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the OperatingTemperatureUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsTemperature_TypePtr getOperatingTemperatureUnit() const;

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

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

	/*!
	* \brief Sets the value of the OperatingHumidity attribute.
	*
	* This field records the ambient humidity at which this device is designed to operate, according to the manufactuer.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setOperatingHumidity(const Inscoper::NBO::PercentFraction_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the OperatingHumidity attribute.
	*
	* This field records the ambient humidity at which this device is designed to operate, according to the manufactuer.
	*
	* \return The value of the attribute
	*/
	PercentFraction_TypePtr getOperatingHumidity() const;

	/*!
	* \brief Resets the OperatingHumidity attribute to an unset state.
	*
	* This field records the ambient humidity at which this device is designed to operate, according to the manufactuer.
	*/
	void resetOperatingHumidity();

	/*!
	* \brief Checks whether the optional OperatingHumidity attribute is present.
	*
	* This field records the ambient humidity at which this device is designed to operate, according to the manufactuer.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasOperatingHumidity() const;

	/*!
	* \brief Sets the value of the WarmUpTime attribute.
	*
	* This field records the time it takes for this device to reach operating conditions according to the Manufacturer.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setWarmUpTime(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the WarmUpTime attribute.
	*
	* This field records the time it takes for this device to reach operating conditions according to the Manufacturer.
	*
	* \return The value of the attribute
	*/
	float getWarmUpTime() const;

	/*!
	* \brief Resets the WarmUpTime attribute to an unset state.
	*
	* This field records the time it takes for this device to reach operating conditions according to the Manufacturer.
	*/
	void resetWarmUpTime();

	/*!
	* \brief Checks whether the WarmUpTime attribute is present.
	*
	* This field records the time it takes for this device to reach operating conditions according to the Manufacturer.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasWarmUpTime() const;

	/*!
	* \brief Sets the value of the WarmUpTimeUnit 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 setWarmUpTimeUnit(const Inscoper::NBO::UnitsTime_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the WarmUpTimeUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsTime_TypePtr getWarmUpTimeUnit() const;

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

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

	/*!
	* \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;

	ElectroOpticalDeviceID_TypePtr ID = nullptr; // Required attribute
	Denomination_TypePtr Name = nullptr; // Optional attribute
	ModulationModeList_TypePtr ModulationMode = nullptr; // Optional attribute
	PercentFraction_TypePtr ContrastRatio = nullptr; // Optional attribute
    std::optional<std::string> Coating; // Optional attribute
    static const std::set<std::string> CoatingAllowedValues;
	AttenuationMethodType_TypePtr AttenuationMethod = nullptr; // Optional attribute
    std::optional<float> AttenuationCoefficient; // Optional attribute
    std::optional<float> TuningAccuracy; // Required attribute
	UnitsLength_TypePtr TuningAccuracyUnit = nullptr; // Required attribute
    std::optional<float> TuningResolution; // Optional attribute
	UnitsLength_TypePtr TuningResolutionUnit = nullptr; // Optional attribute
    std::optional<float> TuningRate; // Optional attribute
	UnitsTime_TypePtr TuningRateUnit = nullptr; // Optional attribute
    std::optional<float> AngleOfIncidence; // Optional attribute
	UnitsAngle_TypePtr AngleOfIncidenceUnit = nullptr; // Optional attribute
    std::optional<float> AngularAperture; // Optional attribute
	UnitsAngle_TypePtr AngularApertureUnit = nullptr; // Optional attribute
    std::optional<float> OperatingTemperature; // Optional attribute
	UnitsTemperature_TypePtr OperatingTemperatureUnit = nullptr; // Optional attribute
	PercentFraction_TypePtr OperatingHumidity = nullptr; // Optional attribute
    std::optional<float> WarmUpTime; // Optional attribute
	UnitsTime_TypePtr WarmUpTimeUnit = nullptr; // Optional attribute
    Inscoper::NBO::AnnotationRefPtr AnnotationRef = nullptr;
};

/*! Shared pointer for ElectroOpticalDevice_Type*/
typedef std::shared_ptr<ElectroOpticalDevice_Type> ElectroOpticalDevice_TypePtr;

} // namespace Inscoper::NBO

#endif // ELECTROOPTICALDEVICE_TYPE_HPP_INCLUDED