Files
Noja/src/lib/objects/objects.h
T
2022-12-05 11:36:19 +01:00

168 lines
7.3 KiB
C

/* +--------------------------------------------------------------------------+
** | _ _ _ |
** | | \ | | (_) |
** | | \| | ___ _ __ _ |
** | | . ` |/ _ \| |/ _` | |
** | | |\ | (_) | | (_| | |
** | |_| \_|\___/| |\__,_| |
** | _/ | |
** | |__/ |
** +--------------------------------------------------------------------------+
** | Copyright (c) 2022 Francesco Cozzuto <francesco.cozzuto@gmail.com> |
** +--------------------------------------------------------------------------+
** | This file is part of The Noja Interpreter. |
** | |
** | The Noja Interpreter 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 3 of the License, or (at |
** | your option) any later version. |
** | |
** | The Noja Interpreter 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 The Noja Interpreter. If not, see <http://www.gnu.org/licenses/>. |
** +--------------------------------------------------------------------------+
*/
#ifndef OBJECT_H
#define OBJECT_H
#include <stdio.h>
#include <dirent.h>
#include <stdbool.h>
#include "../utils/error.h"
#define MAX_RETS 8
typedef struct TypeObject TypeObject;
typedef struct Object Object;
typedef struct xHeap Heap;
struct Object {
TypeObject *type;
unsigned int flags;
};
typedef struct {
Object base;
Object *new_location;
} MovedObject;
struct TypeObject {
Object base;
const char *name;
size_t size;
bool (*init)(Object *self, Error *err);
bool (*free)(Object *self, Error *err);
int (*hash)(Object *self);
Object* (*copy)(Object *self, Heap *heap, Error *err);
int (*call)(Object *self, Object **argv, unsigned int argc, Object *rets[static MAX_RETS], Heap *heap, Error *err);
void (*print)(Object *self, FILE *fp);
// Collections.
Object *(*select)(Object *self, Object *key, Heap *heap, Error *err);
Object *(*delete)(Object *self, Object *key, Heap *heap, Error *err);
bool (*insert)(Object *self, Object *key, Object *val, Heap *heap, Error *err);
int (*count)(Object *self);
// Types.
bool (*istypeof)(Object *self, Object *other, Heap *heap, Error *error);
bool (*op_eql)(Object *self, Object *other);
void (*walk) (Object *self, void (*callback)(Object **referer, void *userp), void *userp);
void (*walkexts)(Object *self, void (*callback)(void **referer, unsigned int size, void *userp), void *userp);
};
enum {
Object_STATIC = 1,
Object_MOVED = 2,
};
Heap* Heap_New(int size);
void Heap_Free(Heap *heap);
void* Heap_Malloc (Heap *heap, TypeObject *type, Error *err);
void* Heap_RawMalloc(Heap *heap, int size, Error *err);
bool Heap_StartCollection(Heap *heap, Error *error);
bool Heap_StopCollection(Heap *heap);
void Heap_CollectReference(Object **referer, void *heap);
float Heap_GetUsagePercentage(Heap *heap);
unsigned int Heap_GetObjectCount(Heap *heap);
void *Heap_GetPointer(Heap *heap);
unsigned int Heap_GetSize(Heap *heap);
const TypeObject* Object_GetType(const Object *obj);
const char* Object_GetName(const Object *obj);
int Object_Hash (Object *obj);
Object* Object_Copy (Object *obj, Heap *heap, Error *err);
int Object_Call (Object *obj, Object **argv, unsigned int argc, Object *rets[static MAX_RETS], Heap *heap, Error *err);
void Object_Print(Object *obj, FILE *fp);
bool Object_IsTypeOf(Object *typ, Object *obj, Heap *heap, Error *error);
Object* Object_Select(Object *coll, Object *key, Heap *heap, Error *err);
Object* Object_Delete(Object *coll, Object *key, Heap *heap, Error *err);
bool Object_Insert(Object *coll, Object *key, Object *val, Heap *heap, Error *err);
int Object_Count (Object *coll, Error *err);
void Object_WalkReferences(Object *parent, void (*callback)(Object **referer, void *userp), void *userp);
void Object_WalkExtensions(Object *parent, void (*callback)(void **referer, unsigned int size, void *userp), void *userp);
Object* Object_NewMap(int num, Heap *heap, Error *error);
Object* Object_NewList(int capacity, Heap *heap, Error *error);
Object* Object_NewList2(int num, Object **items, Heap *heap, Error *error);
Object* Object_NewNone(Heap *heap, Error *error);
Object* Object_NewBuffer(size_t size, Heap *heap, Error *error);
Object* Object_NewClosure(Object *parent, Object *new_map, Heap *heap, Error *error);
Object* Object_SliceBuffer(Object *obj, size_t offset, size_t length, Heap *heap, Error *error);
Object* Object_NewNullable(Object *item, Heap *heap, Error *error);
Object* Object_NewSum(Object *item0, Object *item1, Heap *heap, Error *error);
Object* Object_FromInt (long long int val, Heap *heap, Error *error);
Object* Object_FromBool (bool val, Heap *heap, Error *error);
Object* Object_FromFloat (double val, Heap *heap, Error *error);
Object* Object_FromString(const char *str, int len, Heap *heap, Error *error);
Object* Object_FromStream(FILE *fp, Heap *heap, Error *error);
Object* Object_FromDIR(DIR *handle, Heap *heap, Error *error);
TypeObject *Object_GetTypeType();
TypeObject *Object_GetNoneType();
TypeObject *Object_GetIntType();
TypeObject *Object_GetBoolType();
TypeObject *Object_GetFloatType();
TypeObject *Object_GetStringType();
TypeObject *Object_GetListType();
TypeObject *Object_GetMapType();
TypeObject *Object_GetBufferType();
TypeObject *Object_GetFileType();
TypeObject *Object_GetDirType();
TypeObject *Object_GetNullableType();
TypeObject *Object_GetSumType();
bool Object_IsNone(Object *obj);
bool Object_IsInt(Object *obj);
bool Object_IsBool(Object *obj);
bool Object_IsFloat(Object *obj);
bool Object_IsString(Object *obj);
bool Object_IsBuffer(Object *obj);
bool Object_IsFile(Object *obj);
bool Object_IsDir(Object *obj);
bool Object_IsMap(Object *obj);
bool Object_IsList(Object *obj);
long long int Object_GetInt (Object *obj);
bool Object_GetBool (Object *obj);
double Object_GetFloat(Object *obj);
const char *Object_GetString(Object *obj, size_t *size);
DIR *Object_GetDIR(Object *obj);
FILE *Object_GetStream(Object *obj);
void *Object_GetBuffer(Object *obj, size_t *size);
bool Object_Compare(Object *obj1, Object *obj2, Error *error);
extern TypeObject t_type;
#endif