// This example illustrates how C++ classes can be used from Java using SWIG.
// The Java class gets mapped onto the C++ class and behaves as if it is a Java class.

public class main {
  static {
    try {
        System.loadLibrary("example");
    } catch (UnsatisfiedLinkError e) {
      System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e);
      System.exit(1);
    }
  }

  public static void main(String argv[]) 
  {
    // ----- Object creation -----
    
    System.out.println( "Creating some objects:" );
    Circle c = new Circle(10);
    System.out.println( "    Created circle " + c );
    Square s = new Square(10);
    System.out.println( "    Created square " + s );
    
    // ----- Access a static member -----
    
    System.out.println( "\nA total of " + Shape.getNshapes() + " shapes were created" );
    
    // ----- Member data access -----
    
    // Notice how we can do this using functions specific to
    // the 'Circle' class.
    c.setX(20);
    c.setY(30);
    
    // Now use the same functions in the base class
    Shape shape = s;
    shape.setX(-10);
    shape.setY(5);
    
    System.out.println( "\nHere is their current position:" );
    System.out.println( "    Circle = (" + c.getX() + " " + c.getY() + ")" );
    System.out.println( "    Square = (" + s.getX() + " " + s.getY() + ")" );
    
    // ----- Call some methods -----
    
    System.out.println( "\nHere are some properties of the shapes:" );
    Shape[] shapes = {c,s};
    for (int i=0; i<shapes.length; i++)
    {
          System.out.println( "   " + shapes[i].toString() );
          System.out.println( "        area      = " + shapes[i].area() );
          System.out.println( "        perimeter = " + shapes[i].perimeter() );
    }
    
    // Notice how the area() and perimeter() functions really
    // invoke the appropriate virtual method on each object.
    
    // ----- Delete everything -----
    
    System.out.println( "\nGuess I'll clean up now" );
    
    // Note: this invokes the virtual destructor
    // You could leave this to the garbage collector
    c.delete();
    s.delete();
    
    System.out.println( Shape.getNshapes() + " shapes remain" );
    System.out.println( "Goodbye" );
  }
}
