This is an example where we define the class MyMemReleaser
by deriving MemReleaser
, an existing X3D processor which deletes the default X3DNodes and X3DGLNodes. We want here to print the name of the nodes deleted.
X3DAbstractNode
, so we only need to define the function enterX3DAbstractNode
of MyMemReleaserAbstractVisitor
. We also add the definition of an enterCylinder
function to show the validation of functions. Cylinder
doesn't belong to the Abstract component, so there will be an error message.
MemReleaser
in MyMemReleaser
. We have then to plug MyMemReleaserAbstractVisitor
to MyMemReleaser
in the constructor.
#ifndef MYMEMRELEASERABSTRACTVISITOR_H #define MYMEMRELEASERABSTRACTVISITOR_H #include <X3DTK/x3dscenegraph.h> #include <X3DTK/memreleaser.h> namespace X3DTK { // Visitor for the Abstract component of the MemReleaser module. class MyMemReleaserAbstractVisitor : public MemReleaserAbstractVisitor { public: // Constructor. MyMemReleaserAbstractVisitor(); // Enters an X3DAbstractNode. virtual void enterX3DAbstractNode(X3DAbstractNode *N) const; // Enters a Cylinder. virtual void enterCylinder(X3D::Cylinder *C) const; }; } #endif
#include "MyMemReleaserAbstractVisitor.h" #include <iostream> using namespace X3DTK; using namespace std; MyMemReleaserAbstractVisitor::MyMemReleaserAbstractVisitor() : MemReleaserAbstractVisitor() { // Defines the new enter function for the X3DAbstractNode. defineNewEnterFunction(&MyMemReleaserAbstractVisitor::enterX3DAbstractNode); // Defines the new enter function for the Cylinder. This method will not be recorded // because Cylinder doesn't belong to the Abstract component. defineNewEnterFunction(&MyMemReleaserAbstractVisitor::enterCylinder); } void MyMemReleaserAbstractVisitor::enterX3DAbstractNode(X3DAbstractNode *N) const { // Prints the name of the node. cout << N->getTypeName() << " released " << endl; MemReleaserAbstractVisitor::enterX3DAbstractNode(N); } void MyMemReleaserAbstractVisitor::enterCylinder(X3D::Cylinder *C) const { // empty because it will never be called. }
#ifndef MYMEMRELEASER_H #define MYMEMRELEASER_H #include <X3DTK/memreleaser.h> namespace X3DTK { // Class deriving MemReleaser. class MyMemReleaser : public MemReleaser { public: // Constructor. MyMemReleaser(); }; } #endif
#include "MyMemReleaser.h" #include "MyMemReleaserAbstractVisitor.h" #include <iostream> using namespace std; using namespace X3DTK; MyMemReleaser::MyMemReleaser() : MemReleaser() { // Sets the Abstract visitor for MyMemReleaser processor. setComponentVisitor(new MyMemReleaserAbstractVisitor()); }
#include "MyMemReleaser.h" #include <X3DTK/x3dscenegraph.h> #include <iostream> using namespace X3DTK; using namespace std; int main(int argc, char *argv[]) { if (argc <= 1) { cerr << "usage: mymemreleaser input" << endl; exit(0); } // DefaultLoader to load the default X3D Nodes. X3D::Loader *loader = new X3D::Loader(); // Instanciation of the new MemReleaser. MemReleaser *releaser = new MyMemReleaser(); // Loads the scene. X3D::Scene *s = loader->load(argv[1]); // Releases the memory. releaser->release(s); return 1; }