X3DTK::MyMemReleaser
by deriving X3DTK::MemReleaser
, an existing X3D processor which deletes the X3DTK::X3DAbstractNode
nodes and we redefine the appropriate methods.We want here to print the name of the nodes deleted.
X3DTK::X3DAbstractNode
, so we only need to redefine the function enterX3DAbstractNode
of X3DTK::MyMemReleaserAbstractVisitor
. We also add the definition of an enterCylinder function to show the validation of functions. X3DTK::X3D::Cylinder
doesn't belong to the Abstract component, so there will be a warning message.X3DTK::MemReleaser
in X3DTK::MyMemReleaser
. We have then to plug X3DTK::MyMemReleaserAbstractVisitor
to X3DTK::MyMemReleaser
in the constructor.#ifndef MYMEMRELEASERABSTRACTVISITOR_H #define MYMEMRELEASERABSTRACTVISITOR_H #include <X3DTK/X3D/scenegraph.h> #include <X3DTK/memreleaser.h> namespace X3DTK { // Visitor for the Abstract component of the MemReleaser processor. class MyMemReleaserAbstractVisitor : public MemReleaserAbstractVisitor { public: MyMemReleaserAbstractVisitor(); static void enterX3DAbstractNode(X3DAbstractNode *N); static void enterCylinder(X3D::Cylinder *C); }; } #endif
#include "MyMemReleaserAbstractVisitor.h" #include <iostream> using namespace std; namespace X3DTK { MyMemReleaserAbstractVisitor::MyMemReleaserAbstractVisitor() : MemReleaserAbstractVisitor() { // Defines the new enter function for the X3DAbstractNode. defineEnterFunction(&MyMemReleaserAbstractVisitor::enterX3DAbstractNode); // Defines the new enter function for the Cylinder. This method will not be recorded // because X3D::Cylinder doesn't belong to the Abstract component. defineEnterFunction(&MyMemReleaserAbstractVisitor::enterCylinder); } void MyMemReleaserAbstractVisitor::enterX3DAbstractNode(X3DAbstractNode *N) { // Prints the name of the node. cout << N->getTypeName() << " released" << endl; // Call to the super class method. MemReleaserAbstractVisitor::enterX3DAbstractNode(N); } void MyMemReleaserAbstractVisitor::enterCylinder(X3D::Cylinder *) { // 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: MyMemReleaser(); }; } #endif
#include "MyMemReleaser.h" #include "MyMemReleaserAbstractVisitor.h" namespace X3DTK { MyMemReleaser::MyMemReleaser() : MemReleaser() { // Sets the Abstract visitor for MyMemReleaser processor. setComponentVisitor(new MyMemReleaserAbstractVisitor()); } }
#include "MyMemReleaser.h" #include <X3DTK/X3D/scenegraph.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 = X3DLoader::getInstanceOf<X3D::Loader>(); // Instanciation of MyMemReleaser. MemReleaser *releaser = X3DProcessor::getInstanceOf<MyMemReleaser>(); // Loads the scene. X3D::Scene *s = loader->load(argv[1]); // Releases the memory. releaser->release(s); // removes the instance. X3DProcessor::removeInstanceOf<MyMemReleaser>(); X3DLoader::removeInstanceOf<X3D::Loader>(); return 1; }