#ifndef INVERSEATTRIBUTE_H
#define INVERSEATTRIBUTE_H

#include "clstepcore/attrDescriptor.h"

class SC_CORE_EXPORT Inverse_attribute  :    public AttrDescriptor  {

    public:
        const char * _inverted_attr_id;
        const char * _inverted_entity_id;
    protected:
        const AttrDescriptor * _inverted_attr; // not implemented (?!) (perhaps this means "not used"?)
    public:

        Inverse_attribute(
            const char * name,                // i.e. char *
            TypeDescriptor * domainType,
            Logical optional,        // i.e. F U or T*/
            Logical unique,        // i.e. F U or T
            const EntityDescriptor & owner,
            const char * inverted_attr_id = 0
        ) : AttrDescriptor( name, domainType, optional, unique,
                                AttrType_Inverse, owner ),
            _inverted_attr_id( inverted_attr_id ),
            _inverted_entity_id( 0 ), _inverted_attr( 0 )
        { }
        virtual ~Inverse_attribute() { }

        const char * AttrExprDefStr( std::string & s ) const;

        const char * inverted_attr_id_() const {
            return _inverted_attr_id;
        }

        void inverted_attr_id_( const char * iai ) {
            _inverted_attr_id = iai;
        }

        const char * inverted_entity_id_() const {
            return _inverted_entity_id;
        }

        void inverted_entity_id_( const char * iei ) {
            _inverted_entity_id = iei;
        }

        /// FIXME not implemented (?!) (perhaps this means "not set"?)
        //set _inverted_attr in an extra init step in generated code? any other way to ensure pointers are valid?
        const class AttrDescriptor * inverted_attr_() const {
                return _inverted_attr;
        }

        void inverted_attr_( const AttrDescriptor * ia ) {
            _inverted_attr = ia;
        }

        // below are obsolete (and not implemented anyway)
        //         class AttrDescriptor * InverseAttribute() {
        //                 return _inverted_attr;
        //         }
        //         void InverseOf( AttrDescriptor * invAttr ) {
        //             _inverted_attr = invAttr;
        //         }
};


#endif //INVERSEATTRIBUTE_H
