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

myMemReleaser

Introduction

In glNormalViewer, we showed how to define a new processor. In this example we demonstrate the use of virtuality in processor coding. Here we want to release the memory, but the default behavior of the processor is not specific enough. When a node is deleted we want to print its name. To do it, we define the class 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.

Deriving MemReleaserAbstractVisitor

The name of the node is an attribute of 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.

Deriving MemReleaser

We derive the processor X3DTK::MemReleaser in X3DTK::MyMemReleaser. We have then to plug X3DTK::MyMemReleaserAbstractVisitor to X3DTK::MyMemReleaser in the constructor.

Code

MyMemReleaserAbstractVisitor.h

#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

MyMemReleaserAbstractVisitor.cpp

#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...
}

}

MyMemReleaser.h

#ifndef MYMEMRELEASER_H
#define MYMEMRELEASER_H

#include <X3DTK/memreleaser.h>

namespace X3DTK {

// Class deriving MemReleaser.

class MyMemReleaser : public MemReleaser
{
public:
  MyMemReleaser();
};

}

#endif

MyMemReleaser.cpp

#include "MyMemReleaser.h"
#include "MyMemReleaserAbstractVisitor.h"

namespace X3DTK {

MyMemReleaser::MyMemReleaser()
: MemReleaser()
{
  // Sets the Abstract visitor for MyMemReleaser processor. 
  setComponentVisitor(new MyMemReleaserAbstractVisitor());
}

}

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 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;
}

Generated on Wed Apr 7 12:15:26 2004 for X3DToolKit by doxygen 1.3.3