Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

myMemReleaser

introduction

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.

deriving MemReleaserGenericAbstractVisitor

The name of the node is an attribute of X3DAbstractNode, so we only need to define the function enterX3DAbstractNode of MyMemReleaserGenericAbstractVisitor. 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.

deriving MemReleaser

We derive the processor MemReleaser in MyMemReleaser. We have then to plug MyMemReleaserGenericAbstractVisitor to MyMemReleaser in the constructor.

code

MyMemReleaserGenericAbstractVisitor.h




#ifndef MYMEMRELEASERGENERICABSTRACTVISITOR_H
#define MYMEMRELEASERGENERICABSTRACTVISITOR_H

#include <X3DTK/x3d_scenegraph.h>
#include <X3DTK/memreleaser.h>

namespace X3DTK {

// Visitor for the Abstract component of the MemReleaser module.

class MyMemReleaserGenericAbstractVisitor : public MemReleaserGenericAbstractVisitor
{
public:
  // Constructor.
  MyMemReleaserGenericAbstractVisitor();

  // Enters an X3DAbstractNode.
  virtual void enterX3DAbstractNode(X3DAbstractNode *N) const;
  // Enters a Cylinder.
  virtual void enterCylinder(X3D::Cylinder *C) const;
};

}

#endif

MyMemReleaserGenericAbstractVisitor.cpp

#include "MyMemReleaserGenericAbstractVisitor.h"

#include <iostream>

using namespace X3DTK;
using namespace std;

MyMemReleaserGenericAbstractVisitor::MyMemReleaserGenericAbstractVisitor()
: MemReleaserGenericAbstractVisitor()
{
  // Defines the new enter function for the X3DAbstractNode.
  defineEnterFunction(&MyMemReleaserGenericAbstractVisitor::enterX3DAbstractNode);
  // Defines the new enter function for the Cylinder. This method will not be recorded 
  // because Cylinder doesn't belong to the Abstract component.
  defineEnterFunction(&MyMemReleaserGenericAbstractVisitor::enterCylinder);
}

void MyMemReleaserGenericAbstractVisitor::enterX3DAbstractNode(X3DAbstractNode *N) const
{
  // Prints the name of the node.
  cout << N->getTypeName() << " released " << endl;
  MemReleaserGenericAbstractVisitor::enterX3DAbstractNode(N);
}

void MyMemReleaserGenericAbstractVisitor::enterCylinder(X3D::Cylinder *C) const
{
  // empty because it will never be called.
}

MyMemReleaser.h




#ifndef MYMEMRELEASER_H
#define MYMEMRELEASER_H

#include <X3DTK/memreleaser.h>

namespace X3DTK {

// Class deriving MemReleaser.

class MyMemReleaser : public MemReleaser
{
public:
  // Constructor.
  MyMemReleaser();
};

}

#endif

MyMemReleaser.cpp

#include "MyMemReleaser.h"
#include "MyMemReleaserGenericAbstractVisitor.h"

#include <iostream>

using namespace std;
using namespace X3DTK;

MyMemReleaser::MyMemReleaser()
: MemReleaser()
{
  // Sets the Abstract visitor for MyMemReleaser processor.
  setComponentVisitor("Generic", new MyMemReleaserGenericAbstractVisitor());
}

main.cpp

#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 the new MemReleaser.
  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;
}


Generated on Thu Dec 4 13:25:52 2003 for X3DToolKit by doxygen1.2.18