80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "ground_lib.h"
 | |
| #include <cmath>
 | |
| #include <random>
 | |
| 
 | |
| // Math functions
 | |
| GroundValue sinVal(GroundValue* args, int arg_count) {
 | |
|     VALIDATE_ARGS_1(GROUND_DOUBLE);
 | |
|     return GROUND_DOUBLE_VAL(sin(GET_DOUBLE(args[0])));
 | |
| }
 | |
| 
 | |
| GroundValue cosVal(GroundValue* args, int arg_count) {
 | |
|     VALIDATE_ARGS_1(GROUND_DOUBLE);
 | |
|     return GROUND_DOUBLE_VAL(cos(GET_DOUBLE(args[0])));
 | |
| }
 | |
| 
 | |
| GroundValue tanVal(GroundValue* args, int arg_count) {
 | |
|     VALIDATE_ARGS_1(GROUND_DOUBLE);
 | |
|     return GROUND_DOUBLE_VAL(tan(GET_DOUBLE(args[0])));
 | |
| }
 | |
| 
 | |
| GroundValue sqrtVal(GroundValue* args, int arg_count) {
 | |
|     VALIDATE_ARGS_1(GROUND_DOUBLE);
 | |
|     return GROUND_DOUBLE_VAL(sqrt(GET_DOUBLE(args[0])));
 | |
| }
 | |
| 
 | |
| GroundValue modVal(GroundValue* args, int arg_count) {
 | |
|     VALIDATE_ARGS_2(GROUND_INT, GROUND_INT);
 | |
|     return GROUND_INT_VAL(GET_INT(args[0]) % GET_INT(args[1]));
 | |
| }
 | |
| 
 | |
| GroundValue floorVal(GroundValue* args, int arg_count) {
 | |
|     VALIDATE_ARGS_1(GROUND_DOUBLE);
 | |
|     return GROUND_INT_VAL(int(floor(GET_DOUBLE(args[0]))));
 | |
| }
 | |
| 
 | |
| GroundValue ceilVal(GroundValue* args, int arg_count) {
 | |
|     VALIDATE_ARGS_1(GROUND_DOUBLE);
 | |
|     return GROUND_INT_VAL(int(ceil(GET_DOUBLE(args[0]))));
 | |
| }
 | |
| 
 | |
| GroundValue roundVal(GroundValue* args, int arg_count) {
 | |
|     VALIDATE_ARGS_1(GROUND_DOUBLE);
 | |
|     return GROUND_INT_VAL(int(round(GET_DOUBLE(args[0]))));
 | |
| }
 | |
| 
 | |
| GroundValue randomInt(GroundValue* args, int arg_count) {
 | |
|     VALIDATE_ARGS_2(GROUND_INT, GROUND_INT);
 | |
|     std::random_device rd;
 | |
|     std::mt19937 gen(rd());
 | |
|     std::uniform_int_distribution<> distrib(GET_INT(args[0]), GET_INT(args[1]));
 | |
|     return GROUND_INT_VAL(distrib(gen));
 | |
| }
 | |
| 
 | |
| GroundValue randomDouble(GroundValue* args, int arg_count) {
 | |
|     VALIDATE_ARGS_2(GROUND_DOUBLE, GROUND_DOUBLE);
 | |
|     std::random_device rd;
 | |
|     std::mt19937 gen(rd());
 | |
|     std::uniform_real_distribution<> distrib(GET_DOUBLE(args[0]), GET_DOUBLE(args[1]));
 | |
|     return GROUND_DOUBLE_VAL(distrib(gen));
 | |
| }
 | |
| 
 | |
| // Library setup
 | |
| GROUND_LIBRARY_INTERFACE()
 | |
| 
 | |
| GROUND_LIBRARY_INIT()
 | |
|     REGISTER_GROUND_FUNCTION(sinVal);
 | |
|     REGISTER_GROUND_FUNCTION(cosVal);
 | |
|     REGISTER_GROUND_FUNCTION(tanVal);
 | |
|     REGISTER_GROUND_FUNCTION(sqrtVal);
 | |
|     REGISTER_GROUND_FUNCTION(modVal);
 | |
|     REGISTER_GROUND_FUNCTION(floorVal);
 | |
|     REGISTER_GROUND_FUNCTION(ceilVal);
 | |
|     REGISTER_GROUND_FUNCTION(roundVal);
 | |
|     REGISTER_GROUND_FUNCTION(randomInt);
 | |
|     REGISTER_GROUND_FUNCTION(randomDouble);
 | |
| GROUND_LIBRARY_INIT_END()
 | |
| 
 | |
| GROUND_LIBRARY_CLEANUP()
 | |
| GROUND_LIBRARY_CLEANUP_END()
 |