* BUG: Update Makefile.am with new source files.
* NEW: Add a complex dynamic constructor.
* NEW: Add a complex static constructor _call().
* NEW: Add Complex.Copy().
* NEW: Add Complex.ToString().


git-svn-id: svn://localhost/gambas/trunk@4478 867c0c6c-44f3-4631-809d-bfa615b0a4ec
This commit is contained in:
Benoît Minisini 2012-02-14 08:06:09 +00:00
parent d0757716c7
commit 21dac9f92d
2 changed files with 123 additions and 35 deletions

View file

@ -8,4 +8,4 @@ gblib_LTLIBRARIES = gb.gsl.la
gb_gsl_la_LIBADD = @GSL_LIB@
gb_gsl_la_LDFLAGS = -module @LD_FLAGS@ @GSL_LDFLAGS@
gb_gsl_la_SOURCES = main.c main.h c_gsl.c c_gsl.h
gb_gsl_la_SOURCES = main.c main.h c_gsl.c c_gsl.h c_complex.c c_complex.h

View file

@ -1,29 +1,28 @@
/***************************************************************************
gsl.c
gsl.c
gb.gsl component
gb.gsl component
(c) 2012 Randall Morgan <rmorgan62@gmail.com>
(c) 2012 Randall Morgan <rmorgan62@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option)
any later version.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.
***************************************************************************/
#ifndef __C_GSL_COMPLEX_C
#define __C_GSL_COMPLEX_C
#include "c_complex.h"
@ -35,8 +34,37 @@
#include <gsl/gsl_complex_math.h>
#include <gsl/gsl_sf.h>
#include <stdio.h>
#endif
static GSLCOMPLEX *create_complex()
{
return (GSLCOMPLEX *)GB.New(GB.FindClass("Complex"), NULL, NULL);
}
BEGIN_METHOD(GslComplex_new, GB_FLOAT real; GB_FLOAT imag)
THIS->number.dat[0] = VARGOPT(real, 0.0);
THIS->number.dat[1] = VARGOPT(imag, 0.0);
END_METHOD
BEGIN_METHOD(GslComplex_call, GB_FLOAT real; GB_FLOAT imag)
GSLCOMPLEX *c = create_complex();
c->number.dat[0] = VARG(real);
c->number.dat[1] = VARG(imag);
GB.ReturnObject(c);
END_METHOD
BEGIN_METHOD_VOID(GslComplex_Copy)
GSLCOMPLEX *c = create_complex();
c->number = THIS->number;
GB.ReturnObject(c);
END_METHOD
BEGIN_PROPERTY(GslComplex_Real)
@ -58,39 +86,99 @@ BEGIN_PROPERTY(GslComplex_Imagined)
END_PROPERTY
/**************************************************
Elemntary math functions for complex numbers
Elemntary math functions for complex numbers
**************************************************/
BEGIN_METHOD(GslComplex_Add, GB_OBJECT x;)
GSLCOMPLEX *p = VARG(x);
GSLCOMPLEX *obj;
BEGIN_METHOD(GslComplex_Add, GB_OBJECT x)
GSLCOMPLEX *x = VARG(x);
GSLCOMPLEX *obj;
// Create new object
obj = (GSLCOMPLEX *) GB.New(GB.FindClass("Complex"), NULL, NULL);
if (GB.CheckObject(x))
return;
// Create new object
obj = create_complex();
// Add two complex numbers
obj->number = gsl_complex_add(THIS->number, p->number);
// Add two complex numbers
obj->number = gsl_complex_add(THIS->number, x->number);
return GB.ReturnObject(obj);
GB.ReturnObject(obj);
END_METHOD
BEGIN_METHOD_VOID(GslComplex_ToString)
char buffer[64];
char *p;
char *str;
int len;
double real, imag;
real = THIS->number.dat[0];
imag = THIS->number.dat[1];
if (real == 0.0 && imag == 0.0)
{
GB.ReturnConstZeroString("0");
return;
}
p = buffer;
if (real != 0.0)
{
GB.NumberToString(FALSE, real, NULL, &str, &len);
strncpy(p, str, len);
p += len;
}
if (imag != 0.0)
{
if (imag < 0.0)
{
*p++ = '-';
imag = (-imag);
}
else if (p != buffer)
*p++ = '+';
if (imag != 1.0)
{
GB.NumberToString(FALSE, imag, NULL, &str, &len);
strncpy(p, str, len);
p += len;
}
*p++ = 'i';
}
GB.ReturnNewString(buffer, p - buffer);
END_METHOD
/**************************************************
Describe Class properties and methods to Gambas
Describe Class properties and methods to Gambas
**************************************************/
GB_DESC CGslComplexDesc[] =
{
GB_DECLARE("Complex", sizeof(GSLCOMPLEX)),
GB_DECLARE("Complex", sizeof(GSLCOMPLEX)),
GB_METHOD("_new", NULL, GslComplex_new, "[(Real)f(Imag)f]"),
GB_STATIC_METHOD("_call", "Complex", GslComplex_call, "[(Real)f(Imag)f]"),
GB_METHOD("Copy", "Complex", GslComplex_Copy, NULL),
GB_PROPERTY("REAL", "f", GslComplex_Real),
GB_PROPERTY("IMAG", "f", GslComplex_Imagined),
GB_PROPERTY("Real", "f", GslComplex_Real),
GB_PROPERTY("Imag", "f", GslComplex_Imagined),
GB_PROPERTY("X", "f", GslComplex_Real),
GB_PROPERTY("Y", "f", GslComplex_Imagined),
// Operations on gsl_complex
GB_STATIC_METHOD("Add", "Complex", GslComplex_Add, "(x)Complex"),
GB_END_DECLARE
// Operations on gsl_complex
GB_METHOD("Add", "Complex", GslComplex_Add, "(X)Complex"),
GB_METHOD("ToString", "s", GslComplex_ToString, NULL),
GB_END_DECLARE
};