The sample object model diagram, as shown in the following figure, shows a symmetric association between theFurnace and theRooms. This association is a to‑many link in which one furnace services three rooms.

Roles are implemented as:
By default, a link is with a single instance. A link to a single instance is called scalar. A scalar relation is generated into a data member in the structure of the object whose name is the same as the role and whose type is a pointer to the other object. For example, an itsFurnace member of type pointer to Furnace is generated as a member of the Room structure to represent the Room's link to the Furnace:
struct Room {
/*** User implicit entries ***/
struct Furnace * itsFurnace;
};
The link accessor returns a pointer to the associated object. Its name has the format <object>_get_<rolename>().
For example, the following accessor is generated for the itsFurnace role:
struct Furnace * Room_get_itsFurnace(const Room*
const me);
This is the implementation of the link accessor:
struct Furnace * Room_get_itsFurnace(
const Room* const me)
{
return (struct Furnace * )me->itsFurnace;
}
The link mutator sets a pointer to the associated object. If the link is symmetric, the mutator also sets the reciprocal link.
Up to three methods can be generated for the link mutator:
For example, the following mutator is generated for the itsFurnace role:
void Room_setItsFurnace(Room* const me, struct Furnace
*p_Furnace);
This is the implementation of the link mutator. The link between Furnace and the Room is symmetric, so the mutator also sets the reciprocal link:
void Room_setItsFurnace(Room* const me, struct Furnace
*p_Furnace) {
if(p_Furnace != NULL)
Furnace__addItsRoom(p_Furnace, me);
Room__setItsFurnace(me, p_Furnace);
}
If the link is a symmetric relation, the first mutator calls a second that has a double underscore before the word "set" in its name:
void Room__setItsFurnace(Room* const me, struct Furnace
*p_Furnace) {
if(me->itsFurnace != NULL)
Furnace__removeItsRoom(me->itsFurnace, me);
Room___setItsFurnace(me, p_Furnace);
}
If the link is a symmetric relation, the second mutator calls a third that has a triple underscore before the word "set" in its name:
void Room___setItsFurnace(Room* const me,
struct Furnace * p_Furnace) {
me->itsFurnace = p_Furnace;
if(p_Furnace != NULL) {
NOTIFY_RELATION_ITEM_ADDED(me, Room, Furnace,
"itsFurnace", p_Furnace, FALSE, TRUE);
}
else
{
NOTIFY_RELATION_CLEARED(me, Room,"itsFurnace");
}
}
Together, these three operations set the symmetric link between the Furnace and the Room.