For normal use there is only one function of interest:
NewSubmodule(M, gens)
I shall suppose that the maintainer documentation for modules and EFGModules has already been read and digested. It could also be helpful to have read ring.txt since the "design philosophy" here imitates that used for rings.
SubmoduleImpl is a concrete class derived from EFGModuleBase, i.e. objects of this class represent submodules of explicitly finitely generated modules. The data members comprise the two obvious values:
FreeModule myM; // the ambient module in which the generators live vector<ModuleElem> myGensArray; // the generators as specified by the user
Additionally there are two other data members:
bool myTidyGensIsValid; // true iff myTidyGensArray contains a correct value vector<ModuleElem> myTidyGensArray; // a "nice" set of generators
It is difficult to be precise about the value which myTidyGensArray should contain (when valid) since it depends upon the module. If the module is over a polynomial ring then it will be a Groebner basis. If the module is over Z then it will presumably be either a "Hermite Basis" or an "LLL Basis".
Implementation and documentation are rather incomplete.
Why is myM a FreeModule and not an EFGModule???
What is myTidyGensArray for a module over Z???