Gyoji Compiler
Loading...
Searching...
No Matches
types.hpp
1#pragma once
2
3#include <gyoji-misc/pointers.hpp>
4#include <gyoji-context.hpp>
5#include <string>
6#include <map>
7#include <vector>
8
27namespace Gyoji::mir {
28 class Type;
29 class Types;
30 class Argument;
31
40 class Types {
41 public:
50 Types();
57 ~Types();
58
65 Type * get_type(std::string type) const;
66
74 const Type * get_pointer_to(const Type *_type, const Gyoji::context::SourceReference & src_ref);
75
83 const Type * get_reference_to(const Type *_type, const Gyoji::context::SourceReference & src_ref);
84
93 const Type * get_array_of(const Type *_type, size_t _length, const Gyoji::context::SourceReference & src_ref);
94
104
109 void dump(FILE *out) const;
110
116 private:
118 };
119
127 class Argument {
128 public:
134 Argument(
135 const Type *_argument_type,
136 const Gyoji::context::SourceReference & _source_ref
137 );
144 Argument(const Argument & _other);
151 ~Argument();
155 const Type* get_type() const;
161 private:
162 const Type *argument_type;
163 const Gyoji::context::SourceReference *source_ref;
164 };
165
178 public:
186 std::string _member_name,
187 size_t _index,
188 const Type *_member_type,
189 const Gyoji::context::SourceReference & _source_ref
190 );
197 TypeMember(const TypeMember & other);
204 ~TypeMember();
208 const std::string & get_name() const;
209
226 size_t get_index() const;
227
231 const Type *get_type() const;
237 private:
238 std::string member_name;
239 size_t index;
240 const Type *member_type;
241 const Gyoji::context::SourceReference *source_ref;
242 };
243
256 public:
258 std::string _method_name,
259 const Gyoji::context::SourceReference & _source_ref,
260 const Type *_class_type,
261 const Type *_return_type,
262 const std::vector<Argument> _arguments
263 );
264 ~TypeMethod();
265
266 const std::string & get_name() const;
267 const Gyoji::context::SourceReference & get_source_ref() const;
268 const Type *get_class_type() const;
269 const Type *get_return_type() const;
270 const std::vector<Argument> & get_arguments() const;
271 private:
272 std::string method_name;
273 const Gyoji::context::SourceReference & source_ref;
274 const Type *class_type;
275 const Type *return_type;
276 std::vector<Argument> arguments;
277 };
278
299 class Type {
300 public:
475
489 Type(
490 std::string _name,
491 TypeType _type,
492 bool _complete,
493 const Gyoji::context::SourceReference & _source_ref
494 );
500 Type(
501 std::string _name,
502 const Gyoji::context::SourceReference & _source_ref,
503 const Type & _other
504 );
505
512 ~Type();
513
517 const std::string & get_name() const;
524 bool is_complete() const;
525
530 bool is_primitive() const;
535 bool is_pointer() const;
540 bool is_reference() const;
547 bool is_numeric() const;
553 bool is_integer() const;
558 bool is_unsigned() const;
563 bool is_signed() const;
568 bool is_float() const;
573 bool is_bool() const;
578 bool is_void() const;
583 bool is_enum() const;
589 bool is_composite() const;
594 bool is_function_pointer() const;
595
600 bool is_array() const;
601
608 size_t get_primitive_size() const;
609
613 TypeType get_type() const;
614
625 const std::vector<TypeMember> & get_members() const;
626
632
639 const TypeMember *member_get(const std::string & member_name) const;
640
646 const Type * get_pointer_target() const;
647
654 size_t get_array_length() const;
655
661 const Type * get_return_type() const;
662
669
676 const Gyoji::context::SourceReference & _source_ref
677 );
678
682 void complete_pointer_definition(const Type *_type, const Gyoji::context::SourceReference & _source_ref);
683
687 void complete_array_definition(const Type *_type, size_t _array_size, const Gyoji::context::SourceReference & _source_ref);
688
689 void complete_enum_definition(const Type *_type, const Gyoji::context::SourceReference & _source_ref);
690
697 const Type *_return_type,
698 const std::vector<Argument> & _argument_types,
699 const Gyoji::context::SourceReference & _source_ref
700 );
701
706 void dump(FILE *out) const;
707
716
724
725 private:
726 std::string name;
727 TypeType type;
728 bool complete;
729
730 const Gyoji::context::SourceReference *declared_source_ref;
731 const Gyoji::context::SourceReference *defined_source_ref;
732
733 // Used only for pointer and reference types.
734 const Type *pointer_or_ref;
735 size_t array_length;
736
737 // Used only for function pointer types.
738 const Type *return_type;
739 std::vector<Argument> argument_types;
740
741 // Used only for class/composite types.
744
745 // Used only for class/composite types.
747 };
748};
References a location in the source-file.
Definition source-reference.hpp:16
Function argument.
Definition types.hpp:127
const Gyoji::context::SourceReference & get_source_ref() const
Definition type.cpp:381
~Argument()
Move along, nothing to see here.
Definition type.cpp:374
const Type * get_type() const
Definition type.cpp:377
This represents a typed member variable of a class.
Definition types.hpp:177
~TypeMember()
Move along, nothing to see here.
Definition type-member.cpp:26
const Gyoji::context::SourceReference & get_source_ref() const
Definition type-member.cpp:36
size_t get_index() const
Definition type-member.cpp:39
const Type * get_type() const
Definition type-member.cpp:33
const std::string & get_name() const
Definition type-member.cpp:30
Method of a class.
Definition types.hpp:255
This represents a type as declared in a translation unit.
Definition types.hpp:299
bool is_float() const
Definition type.cpp:134
bool is_complete() const
Definition type.cpp:47
bool is_signed() const
Definition type.cpp:114
bool is_void() const
Definition type.cpp:149
void complete_pointer_definition(const Type *_type, const Gyoji::context::SourceReference &_source_ref)
Definition type.cpp:242
const std::vector< TypeMember > & get_members() const
Definition type.cpp:205
void complete_composite_definition(std::vector< TypeMember > _members, std::map< std::string, TypeMethod > _methods, const Gyoji::context::SourceReference &_source_ref)
Definition type.cpp:259
const Type * get_return_type() const
Definition type.cpp:231
bool is_composite() const
Definition type.cpp:159
void dump(FILE *out) const
Definition type.cpp:295
bool is_unsigned() const
Definition type.cpp:124
bool is_bool() const
Definition type.cpp:142
bool is_numeric() const
Definition type.cpp:81
bool is_array() const
Definition type.cpp:167
const TypeMember * member_get(const std::string &member_name) const
Definition type.cpp:213
bool is_pointer() const
Definition type.cpp:73
const std::map< std::string, TypeMethod > & get_methods() const
Definition type.cpp:209
const Gyoji::context::SourceReference & get_defined_source_ref() const
Definition type.cpp:291
~Type()
Move along, nothing to see here.
Definition type.cpp:43
size_t get_primitive_size() const
Definition type.cpp:171
bool is_primitive() const
Definition type.cpp:51
const Type * get_pointer_target() const
Definition type.cpp:223
bool is_reference() const
Definition type.cpp:77
const std::vector< Argument > & get_argument_types() const
Definition type.cpp:235
size_t get_array_length() const
Definition type.cpp:227
bool is_integer() const
Definition type.cpp:99
TypeType get_type() const
Definition type.cpp:198
const Gyoji::context::SourceReference & get_declared_source_ref() const
Definition type.cpp:287
const std::string & get_name() const
Definition type.cpp:201
bool is_function_pointer() const
Definition type.cpp:163
void complete_array_definition(const Type *_type, size_t _array_size, const Gyoji::context::SourceReference &_source_ref)
Definition type.cpp:250
bool is_enum() const
Definition type.cpp:155
void complete_function_pointer_definition(const Type *_return_type, const std::vector< Argument > &_argument_types, const Gyoji::context::SourceReference &_source_ref)
Definition type.cpp:274
TypeType
Type of type.
Definition types.hpp:321
@ TYPE_PRIMITIVE_u16
Primitive 16-bit unsigned integer.
Definition types.hpp:337
@ TYPE_ENUM
Definition types.hpp:468
@ TYPE_ARRAY
Definition types.hpp:473
@ TYPE_PRIMITIVE_void
Primitive 'void' type.
Definition types.hpp:434
@ TYPE_REFERENCE
Definition types.hpp:462
@ TYPE_PRIMITIVE_f32
Primitive 32 bit floating-point number.
Definition types.hpp:398
@ TYPE_COMPOSITE
Definition types.hpp:443
@ TYPE_PRIMITIVE_i8
Primitive 8-bit signed integer.
Definition types.hpp:363
@ TYPE_PRIMITIVE_f64
Primitive 64 bit floating-point number.
Definition types.hpp:405
@ TYPE_PRIMITIVE_i16
Primitive 16-bit signed integer.
Definition types.hpp:372
@ TYPE_PRIMITIVE_i32
Primitive 32-bit signed integer.
Definition types.hpp:381
@ TYPE_PRIMITIVE_u8
Primitive 8-bit unsigned integer.
Definition types.hpp:329
@ TYPE_POINTER
Definition types.hpp:450
@ TYPE_FUNCTION_POINTER
Definition types.hpp:455
@ TYPE_PRIMITIVE_bool
Primitive boolean value holding 'true' or 'false'.
Definition types.hpp:418
@ TYPE_PRIMITIVE_i64
Primitive 64-bit signed integer.
Definition types.hpp:390
@ TYPE_PRIMITIVE_u64
Primitive 64-bit unsigned integer.
Definition types.hpp:353
@ TYPE_PRIMITIVE_u32
Primitive 32-bit unsigned integer.
Definition types.hpp:345
Set of types extracted from a translation unit.
Definition types.hpp:40
const std::map< std::string, Gyoji::owned< Type > > & get_types() const
Definition types.cpp:105
Type * get_type(std::string type) const
Definition types.cpp:42
const Type * get_reference_to(const Type *_type, const Gyoji::context::SourceReference &src_ref)
Definition types.cpp:66
const Type * get_array_of(const Type *_type, size_t _length, const Gyoji::context::SourceReference &src_ref)
Definition types.cpp:82
void define_type(Gyoji::owned< Type > type)
Definition types.cpp:98
void dump(FILE *out) const
Definition types.cpp:110
Types()
Creates a new types table with only the primitive types defined.
Definition types.cpp:15
const Type * get_pointer_to(const Type *_type, const Gyoji::context::SourceReference &src_ref)
Definition types.cpp:51
~Types()
Move along, nothing to see here.
Definition types.cpp:38
Middle intermediate representation (MIR) of a translation unit.
Definition gyoji-mir.hpp:37