14.3. Object Identity

Many languages provide built-in pointer and structural equality and comparison. To preserve encapsulation, in Sather these operations must go through the class interface like every method. The '=' symbol is syntactic sugar for a call to 'is_eq' (See Syntactic sugar expressions). 'is_eq:BOOL' must be explicitly defined by the type of the left side for this syntax to be useful.

The SYS class (See SYS defines a number of routines for accessing system information:) can be used to obtain equality based on pointer or structural notions of identity. This class also provides built-in mechanisms for comparison and hashing.

Example 14-4. Classes which define their own notion of equality should subtype from $IS_EQ. This class is a common parameter bound in container classes.

   -- In standard library

type $IS_EQ is
   is_eq(e:$OB): BOOL;
end;

Example 14-5. Many classes define a notion of equality which is different than pointer equality. For example, two STR strings may be equal although they are not unique.

class STR < $IS_EQ is
   ...
   is_eq(arg:$OB):BOOL is ... end;
   ...
end

Example 14-6. Many container classes need to be able to compute hash values of their items. Just as with 'is_eq', classes may subtype from $HASH to indicate that they know how to compute their own hash value. ID also provides this built-in hash function.

   -- In standard library
type $HASH is
   hash:INT;
end

Example 14-7. To preserve class encapsulation, Sather does not provide a built-in way to copy objects. By convention, objects are copied by a class-defined routine 'copy', and classes which provide this should subtype from $COPY.

   -- In standard library
type $COPY is
   copy:SAME;
end