/*
 * ValueOperationAbstraction.hpp
 *
 *  Created on: 11. 7. 2017
 *	  Author: Jan Travnicek
 */

#ifndef _VALUE_OPERATION_ABSTRACTION_HPP_
#define _VALUE_OPERATION_ABSTRACTION_HPP_

#include <common/ParamQualifiers.hpp>

#include <abstraction/ValueOperationAbstractionImpl.hpp>

namespace abstraction {

template < class ReturnType >
class ValueOperationAbstraction : virtual public ValueOperationAbstractionImpl < ReturnType > {
	bool isConst ( ) const override {
		return std::is_const_v < std::remove_reference_t < ReturnType > >;
	}

	bool isRvalueRef ( ) const override {
		return std::is_rvalue_reference_v < ReturnType >;
	}

	bool isLvalueRef ( ) const override {
		return std::is_lvalue_reference_v < ReturnType >;
	}

public:
	ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
		return abstraction::ParamQualifiers::paramQualifiers < ReturnType > ( );
	}
};

} /* namespace abstraction */

#endif /* _VALUE_OPERATION_ABSTRACTION_HPP_ */