Browse Source

add new example of simple 'function' overloading using C11 _Generic keyword

master
T. Meissner 9 years ago
parent
commit
1cd4dcfbe7
3 changed files with 107 additions and 0 deletions
  1. +45
    -0
      21st_century_c/complex.c
  2. +31
    -0
      21st_century_c/cplx.h
  3. +31
    -0
      21st_century_c/simple_cplx.c

+ 45
- 0
21st_century_c/complex.c View File

@ -0,0 +1,45 @@
#include "cplx.h"
#include <gsl/gsl_blas.h>
#include <gsl/gsl_complex_math.h>
gsl_vector_complex *cvec_dot_gslcplx(gsl_vector_complex *v, gsl_complex x) {
gsl_vector_complex *out = gsl_vector_complex_alloc(v->size);
for (size_t i=0; i < v->size; i++) {
gsl_vector_complex_set(out, i, gsl_complex_mul(x, gsl_vector_complex_get(v, i)));
}
return out;
}
gsl_vector_complex *vec_dot_gslcplx(gsl_vector *v, gsl_complex x) {
gsl_vector_complex *out = gsl_vector_complex_alloc(v->size);
for (size_t i=0; i < v->size; i++) {
gsl_vector_complex_set(out, i, gsl_complex_mul_real(x, gsl_vector_get(v, i)));
}
return out;
}
gsl_vector_complex *cvec_dot_c(gsl_vector_complex *v, complex double x) {
return cvec_dot_gslcplx(v, gsl_cplx_from_c99(x));
}
gsl_vector_complex *vec_dot_c(gsl_vector *v, complex double x) {
return vec_dot_gslcplx(v, gsl_cplx_from_c99(x));
}
complex double ddot(complex double x, complex double y) {
return x * y;
}
void gsl_vector_complex_print(gsl_vector_complex *v) {
for (size_t i = 0; i < v->size; i++) {
gsl_complex x = gsl_vector_complex_get(v, i);
printf("%4g + %4gi%c", GSL_REAL(x), GSL_IMAG(x), i < v->size-1 ? '\t' : '\n');
}
}

+ 31
- 0
21st_century_c/cplx.h View File

@ -0,0 +1,31 @@
#include <complex.h>
#include <gsl/gsl_vector.h>
gsl_vector_complex *cvec_dot_gslcplx(gsl_vector_complex *v, gsl_complex x);
gsl_vector_complex *vec_dot_gslcplx(gsl_vector *v, gsl_complex x);
gsl_vector_complex *cvec_dot_c(gsl_vector_complex *v, complex double x);
gsl_vector_complex *vec_dot_c(gsl_vector *v, complex double x);
void gsl_vector_complex_print(gsl_vector_complex *v);
#define gsl_cplx_from_c99(x) (gsl_complex){.dat = {creal(x), cimag(x)}}
complex double ddot(complex double x, complex double y);
#define dot(x, y) _Generic((x), \
gsl_vector* : dot_given_vec(y), \
gsl_vector_complex* : dot_given_cplx_vec(y), \
default : ddot) \
((x), (y))
#define dot_given_vec(y) _Generic ((y), \
gsl_complex : vec_dot_gslcplx, \
default : vec_dot_c)
#define dot_given_cplx_vec(y) _Generic((y), \
gsl_complex : cvec_dot_gslcplx, \
default : cvec_dot_c)

+ 31
- 0
21st_century_c/simple_cplx.c View File

@ -0,0 +1,31 @@
#include <stdio.h>
#include "cplx.h"
int main() {
int complex a = 1 + 2I;
complex double b = 2 + I;
gsl_complex c = gsl_cplx_from_c99(a);
gsl_vector *v = gsl_vector_alloc(8);
for (size_t i = 0; i < v->size; i++) {
gsl_vector_set(v, i, i/8.);
}
complex double adotb = dot(a, b);
printf("(1+2i) dot (2+i): %g+%gi\n", creal(adotb), cimag(adotb));
printf("v dot 2:\n");
double d = 2;
gsl_vector_complex_print(dot(v, d));
printf("v dot (1+2i)\n");
gsl_vector_complex *vc = dot(v, a);
gsl_vector_complex_print(vc);
printf("v dot (1+2i) again\n");
gsl_vector_complex_print(dot(v, c));
}

Loading…
Cancel
Save