It was my own fault of - I changed the genVariable' function in GenerateCPPCSP but forgot to move it out of the "taken verbatim from GenerateC" function,
so Adam removed it during the tidy-up. I've reinstated it from the old version - I need the ".access()" part for accessing individual array elements.
... and update GenerateCPPCSP to do so. This works by having a structure of
operations (GenOps) through which all the recursive calls go, and having
GenerateCPPCSP replace only the operations that it wants to override.
Previously the arrays used the Blitz++ library, but this was not totally satisfactory. I have therefore resorted (after looking at many different
libraries) to using std::vector (which could perhaps be boost::array instead) coupled with a roll-my-own "array view" class (tockArrayView) that
easily allows all the functionality that we need from arrays (slicing, indexing, copying, unknown dimensions,retyping,reshaping). I have also
had to introduce a nasty little wrapper class tockBool, because vector<bool> is a specialisation that totally breaks things. If I do move to
boost::array, I will be able to remove tockBool.
C++CSP backend has been added. It consists of a support header file and one new Haskell module: GenerateCPPCSP
The module is largely based on GenerateC, changed as needed.
There is a large section at the bottom of the file with verbatim copy-and-paste from GenerateC,
due to wanting the same functionality, but for calls to use my C++CSP generation not the C generation --
hence I cannot simply import those functions.
The backend can generate code for cgtests 0 through 16 (incl) that will compile as valid C++. The majority of the
tests pass when run (some do segfault, admittedly). However some arrays still need more testing/work, particularly:
- timers
- array slices
- retyping
The tock_support_cppcsp.h header makes use of tock_support.h, but I had to add a few #ifnders to the latter
file so that I can use it with C++CSP and block out some of the CIF stuff.
... which required a bunch of stuff:
- Record handling in the literal evaluator (to solve a nasty problem with
record literals documented in the code).
- Splitting abbrevModeOfVariable into two functions which do the two
(different) things it was previously used for.
- Clean up how arrays are handled in GenerateC.
- Fix the pullup rules for record literals containing arrays.