This example_assoc page provides an example of librnr support for simple associative mapping.
Example main():
configuration databases.
#include <stdio.h>
#include <string.h>
typedef enum
{
unknown,
Sun,
Mercury,
Venus,
Earth, Moon,
Mars, Phobos, Deimos,
Ceres,
Jupiter, Io, Europa, Ganymede, Callisto,
Saturn, Titan,
Uranus, Titania,
Neptune, Triton,
Pluto, Charon,
Eris,
NumBodies
typedef struct
{
const char *m_sName;
double m_fDiam;
double m_fOrbitalAvgDist;
double m_fOribtalPeriod;
BodyId_T m_eOrbits;
#define AMAP_NAME Planet
#define AMAP_XTYPE BodyId_T
#define AMAP_YTYPE Factoids_T*
#include "rnr/assoc.h"
{
{"unknown", unknown},
{"Sun", Sun},
{"Mercury", Mercury},
{"Venus", Venus},
{"Earth", Earth},
{"Moon", Moon},
{"Mars", Mars},
{"Phobos", Phobos},
{"Deimos", Deimos},
{"Jupiter", Jupiter},
{"Io", Io},
{"Europa", Europa},
{"Ganymede", Ganymede},
{"Callisto", Callisto},
{"Saturn", Saturn},
{"Uranus", Uranus},
{"Neptune", Neptune},
{"Ceres", Ceres},
{"Pluto", Pluto}
};
double diam, char *units_diam,
double dist, char *units_dist,
double period, char *units_period,
BodyId_T eOrbitsId)
{
const char *sName;
(int)eThisBodyId);
{
fprintf(stderr, "Error: %d: unknown body type", eThisBodyId);
return;
}
if( !strcmp(units_diam, "miles") )
{
diam *= 1.609344;
}
if( !strcmp(units_dist, "miles") )
{
dist *= 1.609344;
}
if( !strcmp(units_period, "years") )
{
period *= 365.25;
}
BodyCount++;
}
{
printf(
"name: %s\n", pOid->
m_sName);
printf(
"diameter: %e km\n", pOid->
m_fDiam);
}
int CmpIds(
const BodyId_T x1,
const BodyId_T x2)
{
return (int)(x1 - x2);
}
{
}
int main(
int argc,
char *argv[])
{
AssocMapPlanetMapper_T map;
AssocMapPlanetPoint_T dft = {unknown,
NULL};
AddNewBody(Mercury, 4878.0,
"km", 46.0E6,
"km", 0.24,
"years", Sun);
AddNewBody(Moon, 3476.0,
"km", 384400.0,
"km", 27.322,
"days", Earth);
AddNewBody(Deimos, 8.0,
"km", 23460.0,
"km", 1.263,
"days", Mars);
AddNewBody(Phobos, 28.0,
"km", 9270.0,
"km", 0.319,
"days", Mars);
AddNewBody(Callisto, 4800.0,
"km", 1883000.0,
"km", 16.689,
"days", Jupiter);
AddNewBody(Europa, 3126.0,
"km", 670900.0,
"km", 3.551,
"days", Jupiter);
AddNewBody(Jupiter, 88736.0,
"miles", 817.0E6,
"km", 12.0,
"years", Sun);
AddNewBody(Earth, 7926.0,
"miles", 91.0E6,
"miles", 1.0,
"years", Sun);
map.m_pMapDft = &dft;
if( (pOid = AssocMapPlanetXtoY(&map, Moon)) != NULL )
{
printf("\n");
}
if( (pOid = AssocMapPlanetXtoY(&map, Mercury)) != NULL )
{
printf("\n");
}
if( (pOid = AssocMapPlanetXtoY(&map, Earth)) != NULL )
{
printf("\n");
}
if( (pOid = AssocMapPlanetXtoY(&map, Callisto)) != NULL )
{
printf("\n");
}
if( (pOid = AssocMapPlanetXtoY(&map, Eris)) != NULL )
{
printf("\n");
}
printf("ceres id: %u\n", AssocMapPlanetYtoX(&map, &findoid));
printf("jupiter id: %u\n", AssocMapPlanetYtoX(&map, &findoid));
return 0;
}
Generated output:
$ ../loc/bin.x86_64/example_assoc
name: Moon
diameter: 3.476000e+03 km
distance: 3.844000e+05 km
period: 27.322000 days
orbits: Earth
name: Mercury
diameter: 4.878000e+03 km
distance: 4.600000e+07 km
period: 87.660000 days
orbits: Sun
name: Earth
diameter: 1.275566e+04 km
distance: 1.464503e+08 km
period: 365.250000 days
orbits: Sun
name: Callisto
diameter: 4.800000e+03 km
distance: 1.883000e+06 km
period: 16.689000 days
orbits: Jupiter
ceres id: 0
jupiter id: 10