#ifndef LASER_HPP_INCLUDED
#define LASER_HPP_INCLUDED

#include <iostream>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <vector>
#include <NBO/NBO/AcoustoOpticalDeviceRef.h>
#include <NBO/NBO/IlluminationWavelengthRange.h>
#include <NBO/NBO/LaserClass_Type.h>
#include <NBO/NBO/LaserMedium_Type.h>
#include <NBO/NBO/LaserModulation_Type.h>
#include <NBO/NBO/LaserType_Type.h>
#include <NBO/NBO/LightSource_Type.h>
#include <NBO/NBO/Pump.h>
#include <NBO/NBO/UnitsFrequency_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 element Laser.
*
* This element describes a Light Source, which emits coherent radiation at high spectral concentrations of radiance and minimal solid angles. This includes proper Light Amplification by Stimulated Emission of Radiation (LASER) sources that emit light through a process of optical amplification based on the stimulated emission of electromagnetic radiation. It also includes Optical Parametric Oscillator (OPO) sources that use a kind of LASER resonator but based on optical gain from parametric amplification in a nonlinear crystal rather than from stimulated emission.
*/
class NBO_EXPORT Laser : public LightSource_Type {

public:
	
	Laser();
	~Laser();

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

	/*!
	* \brief Returns the class type name.
	*
	* \return The class type name
	*/
	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 Type attribute.
	*
	* This field captures the general category of this Laser. Please note that Optical Parametric Oscillators (OPO) are listed here even though they are technically not a LASER. They produce optical gain not through stimulated emission but via parametric amplification in a non-linear crystal.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setType(const Inscoper::NBO::LaserType_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the Type attribute.
	*
	* This field captures the general category of this Laser. Please note that Optical Parametric Oscillators (OPO) are listed here even though they are technically not a LASER. They produce optical gain not through stimulated emission but via parametric amplification in a non-linear crystal.
	*
	* \return The value of the attribute
	*/
	LaserType_TypePtr getType() const;

	/*!
	* \brief Resets the Type attribute to an unset state.
	*
	* This field captures the general category of this Laser. Please note that Optical Parametric Oscillators (OPO) are listed here even though they are technically not a LASER. They produce optical gain not through stimulated emission but via parametric amplification in a non-linear crystal.
	*/
	void resetType();

	/*!
	* \brief Checks whether the optional Type attribute is present.
	*
	* This field captures the general category of this Laser. Please note that Optical Parametric Oscillators (OPO) are listed here even though they are technically not a LASER. They produce optical gain not through stimulated emission but via parametric amplification in a non-linear crystal.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasType() const;

	/*!
	* \brief Sets the value of the Tuneable attribute.
	*
	* This field records whether (True) or not (False) this Laser is Tunable to different Wavelengths
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setTuneable(const bool& value, bool validate = true);

	/*!
	* \brief Returns the value of the Tuneable attribute.
	*
	* This field records whether (True) or not (False) this Laser is Tunable to different Wavelengths
	*
	* \return The value of the attribute
	*/
	bool getTuneable() const;

	/*!
	* \brief Resets the Tuneable attribute to an unset state.
	*
	* This field records whether (True) or not (False) this Laser is Tunable to different Wavelengths
	*/
	void resetTuneable();

	/*!
	* \brief Checks whether the Tuneable attribute is present.
	*
	* This field records whether (True) or not (False) this Laser is Tunable to different Wavelengths
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasTuneable() const;

	/*!
	* \brief Sets the value of the ModulationMechanism attribute.
	*
	* This field captures the Modulation Mechanism used for this Laser.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setModulationMechanism(const Inscoper::NBO::LaserModulation_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ModulationMechanism attribute.
	*
	* This field captures the Modulation Mechanism used for this Laser.
	*
	* \return The value of the attribute
	*/
	LaserModulation_TypePtr getModulationMechanism() const;

	/*!
	* \brief Resets the ModulationMechanism attribute to an unset state.
	*
	* This field captures the Modulation Mechanism used for this Laser.
	*/
	void resetModulationMechanism();

	/*!
	* \brief Checks whether the optional ModulationMechanism attribute is present.
	*
	* This field captures the Modulation Mechanism used for this Laser.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasModulationMechanism() const;

	/*!
	* \brief Sets the value of the Pulse attribute.
	*
	* Whether this Laser emits light in the form of optical Pulses (i.e., light flashes; True) or as a Continuous Wave (CW; False).
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setPulse(const bool& value, bool validate = true);

	/*!
	* \brief Returns the value of the Pulse attribute.
	*
	* Whether this Laser emits light in the form of optical Pulses (i.e., light flashes; True) or as a Continuous Wave (CW; False).
	*
	* \return The value of the attribute
	*/
	bool getPulse() const;

	/*!
	* \brief Resets the Pulse attribute to an unset state.
	*
	* Whether this Laser emits light in the form of optical Pulses (i.e., light flashes; True) or as a Continuous Wave (CW; False).
	*/
	void resetPulse();

	/*!
	* \brief Checks whether the Pulse attribute is present.
	*
	* Whether this Laser emits light in the form of optical Pulses (i.e., light flashes; True) or as a Continuous Wave (CW; False).
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasPulse() const;

	/*!
	* \brief Sets the value of the LaserClass attribute.
	*
	* This describes the safety Class this Laser belongs to. Laser Classes are defined based on their potential for causing injury to humans’ eyes and skin.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setLaserClass(const Inscoper::NBO::LaserClass_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the LaserClass attribute.
	*
	* This describes the safety Class this Laser belongs to. Laser Classes are defined based on their potential for causing injury to humans’ eyes and skin.
	*
	* \return The value of the attribute
	*/
	LaserClass_TypePtr getLaserClass() const;

	/*!
	* \brief Resets the LaserClass attribute to an unset state.
	*
	* This describes the safety Class this Laser belongs to. Laser Classes are defined based on their potential for causing injury to humans’ eyes and skin.
	*/
	void resetLaserClass();

	/*!
	* \brief Checks whether the optional LaserClass attribute is present.
	*
	* This describes the safety Class this Laser belongs to. Laser Classes are defined based on their potential for causing injury to humans’ eyes and skin.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasLaserClass() const;

	/*!
	* \brief Sets the value of the LaserMedium attribute.
	*
	* This field captures the material out of which this Laser is constructed.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setLaserMedium(const Inscoper::NBO::LaserMedium_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the LaserMedium attribute.
	*
	* This field captures the material out of which this Laser is constructed.
	*
	* \return The value of the attribute
	*/
	LaserMedium_TypePtr getLaserMedium() const;

	/*!
	* \brief Resets the LaserMedium attribute to an unset state.
	*
	* This field captures the material out of which this Laser is constructed.
	*/
	void resetLaserMedium();

	/*!
	* \brief Checks whether the optional LaserMedium attribute is present.
	*
	* This field captures the material out of which this Laser is constructed.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasLaserMedium() const;

	/*!
	* \brief Sets the value of the IsPumped attribute.
	*
	* Whether (True) or not (False) this is a pumped Laser.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setIsPumped(const bool& value, bool validate = true);

	/*!
	* \brief Returns the value of the IsPumped attribute.
	*
	* Whether (True) or not (False) this is a pumped Laser.
	*
	* \return The value of the attribute
	*/
	bool getIsPumped() const;

	/*!
	* \brief Resets the IsPumped attribute to an unset state.
	*
	* Whether (True) or not (False) this is a pumped Laser.
	*/
	void resetIsPumped();

	/*!
	* \brief Checks whether the IsPumped attribute is present.
	*
	* Whether (True) or not (False) this is a pumped Laser.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasIsPumped() const;

	/*!
	* \brief Sets the value of the IsPump attribute.
	*
	* Whether (True) or not (False) this laser serves as a Pump for a downstream laser.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setIsPump(const bool& value, bool validate = true);

	/*!
	* \brief Returns the value of the IsPump attribute.
	*
	* Whether (True) or not (False) this laser serves as a Pump for a downstream laser.
	*
	* \return The value of the attribute
	*/
	bool getIsPump() const;

	/*!
	* \brief Resets the IsPump attribute to an unset state.
	*
	* Whether (True) or not (False) this laser serves as a Pump for a downstream laser.
	*/
	void resetIsPump();

	/*!
	* \brief Checks whether the IsPump attribute is present.
	*
	* Whether (True) or not (False) this laser serves as a Pump for a downstream laser.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasIsPump() const;

	/*!
	* \brief Sets the value of the Position attribute.
	*
	* This field captures the position of this Laser on a Multi Laser Engine.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setPosition(const long long& value, bool validate = true);

	/*!
	* \brief Returns the value of the Position attribute.
	*
	* This field captures the position of this Laser on a Multi Laser Engine.
	*
	* \return The value of the attribute
	*/
	long long getPosition() const;

	/*!
	* \brief Resets the Position attribute to an unset state.
	*
	* This field captures the position of this Laser on a Multi Laser Engine.
	*/
	void resetPosition();

	/*!
	* \brief Checks whether the Position attribute is present.
	*
	* This field captures the position of this Laser on a Multi Laser Engine.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasPosition() const;

	/*!
	* \brief Sets the value of the RepetitionRate attribute.
	*
	* In the case this is a pulsed Laser (Pulse is True), this field (also known as Pulse Frequency) describes the frequency of laser pulses. The default unit is Hz.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setRepetitionRate(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the RepetitionRate attribute.
	*
	* In the case this is a pulsed Laser (Pulse is True), this field (also known as Pulse Frequency) describes the frequency of laser pulses. The default unit is Hz.
	*
	* \return The value of the attribute
	*/
	float getRepetitionRate() const;

	/*!
	* \brief Resets the RepetitionRate attribute to an unset state.
	*
	* In the case this is a pulsed Laser (Pulse is True), this field (also known as Pulse Frequency) describes the frequency of laser pulses. The default unit is Hz.
	*/
	void resetRepetitionRate();

	/*!
	* \brief Checks whether the RepetitionRate attribute is present.
	*
	* In the case this is a pulsed Laser (Pulse is True), this field (also known as Pulse Frequency) describes the frequency of laser pulses. The default unit is Hz.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasRepetitionRate() const;

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

	/*!
	* \brief Returns the value of the RepetitionRateUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsFrequency_TypePtr getRepetitionRateUnit() const;

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

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

	/*!
	* \brief Sets the value of the PulseDuration attribute.
	*
	* In the case this is a pulsed Laser (Pulse is True), this field describes the duration of each Laser pulse.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setPulseDuration(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the PulseDuration attribute.
	*
	* In the case this is a pulsed Laser (Pulse is True), this field describes the duration of each Laser pulse.
	*
	* \return The value of the attribute
	*/
	float getPulseDuration() const;

	/*!
	* \brief Resets the PulseDuration attribute to an unset state.
	*
	* In the case this is a pulsed Laser (Pulse is True), this field describes the duration of each Laser pulse.
	*/
	void resetPulseDuration();

	/*!
	* \brief Checks whether the PulseDuration attribute is present.
	*
	* In the case this is a pulsed Laser (Pulse is True), this field describes the duration of each Laser pulse.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasPulseDuration() const;

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

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

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

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

	/*!
	* \brief Sets the value of the FrequencyMultiplication attribute.
	*
	* This field captures the optical frequency multiplication factor that may be specified for this Laser.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setFrequencyMultiplication(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the FrequencyMultiplication attribute.
	*
	* This field captures the optical frequency multiplication factor that may be specified for this Laser.
	*
	* \return The value of the attribute
	*/
	float getFrequencyMultiplication() const;

	/*!
	* \brief Resets the FrequencyMultiplication attribute to an unset state.
	*
	* This field captures the optical frequency multiplication factor that may be specified for this Laser.
	*/
	void resetFrequencyMultiplication();

	/*!
	* \brief Checks whether the FrequencyMultiplication attribute is present.
	*
	* This field captures the optical frequency multiplication factor that may be specified for this Laser.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasFrequencyMultiplication() const;

	/*!
	* \brief Sets the value of the UsedAcoustoOpticalDevice attribute.
	*
	* This field records whether (True) or not (False) an AcoustoOptical Device was utilized during this Calibration Procedure.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setUsedAcoustoOpticalDevice(const bool& value, bool validate = true);

	/*!
	* \brief Returns the value of the UsedAcoustoOpticalDevice attribute.
	*
	* This field records whether (True) or not (False) an AcoustoOptical Device was utilized during this Calibration Procedure.
	*
	* \return The value of the attribute
	*/
	bool getUsedAcoustoOpticalDevice() const;

	/*!
	* \brief Resets the UsedAcoustoOpticalDevice attribute to an unset state.
	*
	* This field records whether (True) or not (False) an AcoustoOptical Device was utilized during this Calibration Procedure.
	*/
	void resetUsedAcoustoOpticalDevice();

	/*!
	* \brief Checks whether the UsedAcoustoOpticalDevice attribute is present.
	*
	* This field records whether (True) or not (False) an AcoustoOptical Device was utilized during this Calibration Procedure.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasUsedAcoustoOpticalDevice() const;

	/*!
	* \brief Sets the list of IlluminationWavelengthRange elements.
	*
	* No description available in the XSD standard.
	*
	* \param value The new list of IlluminationWavelengthRange elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setIlluminationWavelengthRange_List(const std::vector<Inscoper::NBO::IlluminationWavelengthRangePtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of IlluminationWavelengthRange elements.
	*
	* No description available in the XSD standard.
	*
	* \return The list of IlluminationWavelengthRange elements
	*/
	std::vector<Inscoper::NBO::IlluminationWavelengthRangePtr> getIlluminationWavelengthRange_List() const;

	/*!
	* \brief Adds a new IlluminationWavelengthRange element to this object.
	*
	* No description available in the XSD standard.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToIlluminationWavelengthRange_List(const Inscoper::NBO::IlluminationWavelengthRangePtr& value, bool validate = true);

	/*!
	* \brief Clear the list of IlluminationWavelengthRange.
	*
	* No description available in the XSD standard.
	*/
	void clearIlluminationWavelengthRange_List();

	/*!
	* \brief Sets the list of AcoustoOpticalDeviceRef elements.
	*
	* No description available in the XSD standard.
	*
	* \param value The new list of AcoustoOpticalDeviceRef elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setAcoustoOpticalDeviceRef_List(const std::vector<Inscoper::NBO::AcoustoOpticalDeviceRefPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of AcoustoOpticalDeviceRef elements.
	*
	* No description available in the XSD standard.
	*
	* \return The list of AcoustoOpticalDeviceRef elements
	*/
	std::vector<Inscoper::NBO::AcoustoOpticalDeviceRefPtr> getAcoustoOpticalDeviceRef_List() const;

	/*!
	* \brief Adds a new AcoustoOpticalDeviceRef element to this object.
	*
	* No description available in the XSD standard.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToAcoustoOpticalDeviceRef_List(const Inscoper::NBO::AcoustoOpticalDeviceRefPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of AcoustoOpticalDeviceRef.
	*
	* No description available in the XSD standard.
	*/
	void clearAcoustoOpticalDeviceRef_List();

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

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

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

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


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

	LaserType_TypePtr Type = nullptr; // Optional attribute
    std::optional<bool> Tuneable; // Required attribute
	LaserModulation_TypePtr ModulationMechanism = nullptr; // Required attribute
    std::optional<bool> Pulse; // Required attribute
	LaserClass_TypePtr LaserClass = nullptr; // Optional attribute
	LaserMedium_TypePtr LaserMedium = nullptr; // Optional attribute
    std::optional<bool> IsPumped; // Required attribute
    std::optional<bool> IsPump; // Required attribute
    std::optional<long long> Position; // Optional attribute
    std::optional<float> RepetitionRate; // Optional attribute
	UnitsFrequency_TypePtr RepetitionRateUnit = nullptr; // Optional attribute
    std::optional<float> PulseDuration; // Optional attribute
	UnitsTime_TypePtr PulseDurationUnit = nullptr; // Optional attribute
    std::optional<float> FrequencyMultiplication; // Optional attribute
    std::optional<bool> UsedAcoustoOpticalDevice; // Optional attribute
    std::vector<Inscoper::NBO::IlluminationWavelengthRangePtr> IlluminationWavelengthRange_List;
    std::vector<Inscoper::NBO::AcoustoOpticalDeviceRefPtr> AcoustoOpticalDeviceRef_List;
    Inscoper::NBO::PumpPtr Pump = nullptr;
};

/*! Shared pointer for Laser*/
typedef std::shared_ptr<Laser> LaserPtr;

} // namespace Inscoper::NBO

#endif // LASER_HPP_INCLUDED