next up previous
Next: Subtyping Up: Untyped values Previous: Untyped values

Unknown Constructed Types

MICO's Any implementation offers an extended interface for typesafe insertion and extraction of constructed types that were not known at compile time. This interface is also used by the <<= and >>= operators generated by the IDL compiler for constructed types. Lets look at the generated operators for a simple structure:

 1:  // IDL
 2:  struct foo {
 3:    long l;
 4:    string s;
 5:  };
 6:
 7:  // C++
 8:  CORBA::Boolean operator<<= ( CORBA::Any &a, const foo &s )
 9:  {
10:    a.type( _tc_foo );
11:    return a.struct_put_begin() &&
12:           (a <<= s.l) &&
13:           (a <<= s.s) &&
14:           a.struct_put_end();
15:  }
16:
17:  CORBA::Boolean operator>>=( const CORBA::Any &a, foo &s )
18:  {
19:    return a.struct_get_begin() &&
20:           (a >>= s.l) &&
21:           (a >>= s.s) &&
22:           a.struct_get_end();
23:  }

The <<= operator tells the Any the TypeCode (_tc_foo) of the to be inserted structure in line 10. Those _tc_* constants are generated by the IDL compiler as well. If you want to insert a constructed type that was not known at compile time you have to get the TypeCode from somewhere else (e.g., from the interface repository) or you have to create one using the create_*_tc() ORB methods.

After telling the Any the TypeCode the <<= operator opens a structure in line 11, shifts in the elements of the struct in lines 12-13 and closes the struct in line 14. While doing so the Any checks the correctness of the inserted items using the TypeCode. If it detects an error (e.g., the TypeCode says the first element of the struct is a short and you insert a float) the corresponding method or <<= operator will return FALSE. If the structure contained another constructed type you had to make nested calls to struct_put_begin() and struct_put_end() or the corresponding methods for unions, exceptions, arrays, or sequences.

The >>= operator in lines 17-23 has the same structure as the <<= operator but uses >>= operators to extract the struct elements and struct_get_begin() and struct_get_end() to open and close the structure. There is no need to specify a TypeCode before extraction because the Any knows it already.



MICO
Tue Nov 10 11:04:45 CET 1998