If you need to implement a FORTRAN 77 class with state, you can use SIDL arrays to store the state information. This is certainly not the only way to implement a FORTRAN 77 class with state, but it's one that will work wherever Babel works. For example, if you have a class whose state requires three boolean variables and two double precision variables, your constructor might look something like the following:
subroutine example_withState__ctor_fi(self)
implicit none
integer*8 self
C DO-NOT-DELETE splicer.begin(example.withState._ctor)
integer*8 statearray, logarray, dblarray
call sidl_opaque__array_create1d_f(2, statearray)
call sidl_bool__array_create1d_f(3, logarray)
call sidl_double__array_create1d_f(2, dblarray)
if ((statearray .ne. 0) .and. (logarray .ne. 0) .and.
$ (dblarray .ne. 0)) then
call sidl_opaque__array_set1_f(statearray, 0, logarray)
call sidl_opaque__array_set1_f(statearray, 1, dblarray)
else
C a real implementation would not leak memory like this one
statearray = 0
endif
call example_withState__set_data_f(self, statearray)
C DO-NOT-DELETE splicer.end(example.withState._ctor)
end
Of course, it is up to your application make the association between elements of the arrays and particular state variables. For example, you could say that element 0 of the double array is the kinematic viscosity and element 1 could be the airspeed velocity of an unladen swallow. Element 0 of the boolean array could specify African (true) or European (false). The destructor for this class could look something like this:
subroutine example_withState__dtor_fi(self)
implicit none
integer*8 self
C DO-NOT-DELETE splicer.begin(example.withState._dtor)
integer*8 statearray, logarray, dblarray
call example_withState__get_data_f(self, statearray)
if (statearray .ne. 0) then
call sidl_opaque__array_get1_f(statearray, 0, logarray)
call sidl_opaque__array_get1_f(statearray, 1, dblarray)
call sidl_bool__array_deleteRef_f(logarray)
call sidl_double__array_deleteRef_f(dblarray)
call sidl_opaque__array_deleteRef_f(statearray)
C the following two lines are not strictly necessary
statearray = 0
call example_withState__set_data_f(self, statearray)
endif
C DO-NOT-DELETE splicer.end(example.withState._dtor)
end
In this example, an accessor function for the airspeed velocity of an unladen swallow could be implemented as follows:
subroutine example_withState_getAirspeedVelocity_fi(
$ self, velocity)
implicit none
integer*8 self
real*8 velocity
C DO-NOT-DELETE splicer.begin(example.withState.getAirspeedVelocity)
integer*8 statearray, dblarray
call example_withState__get_data_f(self, statearray)
if (statearray .ne. 0) then
call sidl_opaque__array_get1_f(statearray, 1, dblarray)
call sidl_double__array_get1_f(dblarray, 1, velocity)
endif
C DO-NOT-DELETE splicer.end(example.withState.getAirspeedVelocity)
end