Left: | ||
Right: |
LEFT | RIGHT |
---|---|
1 #pragma once | 1 #pragma once |
2 | 2 |
3 #include <cstddef> | |
3 #include <cstdint> | 4 #include <cstdint> |
4 #include <cstdio> | 5 #include <cstdio> |
5 #include <cstdlib> | 6 #include <cstdlib> |
6 #include <exception> | 7 #include <exception> |
7 #include <map> | 8 #include <map> |
8 #include <string> | 9 #include <string> |
9 #include <type_traits> | 10 #include <type_traits> |
10 #include <utility> | 11 #include <utility> |
11 #include <vector> | 12 #include <vector> |
12 | 13 |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
270 }; | 271 }; |
271 | 272 |
272 struct ClassInfo | 273 struct ClassInfo |
273 { | 274 { |
274 ClassInfo* baseClass; | 275 ClassInfo* baseClass; |
275 std::string name; | 276 std::string name; |
276 std::vector<PropertyInfo> properties; | 277 std::vector<PropertyInfo> properties; |
277 std::vector<MethodInfo> methods; | 278 std::vector<MethodInfo> methods; |
278 std::vector<FunctionInfo> initializers; | 279 std::vector<FunctionInfo> initializers; |
279 DifferentiatorInfo subclass_differentiator; | 280 DifferentiatorInfo subclass_differentiator; |
280 int ref_counted_offset; | 281 ptrdiff_t ref_counted_offset; |
sergei
2017/03/20 17:07:18
Can we use ptrdiff_t for ref_counted_offset?
Wladimir Palant
2017/03/21 10:10:15
Done.
| |
281 }; | 282 }; |
282 | 283 |
283 std::map<TYPEID, ClassInfo> classes; | 284 std::map<TYPEID, ClassInfo> classes; |
284 | 285 |
285 void register_class(const char* name, TYPEID classID, TYPEID baseClassID, | 286 void register_class(const char* name, TYPEID classID, TYPEID baseClassID, |
286 int ref_counted_offset) | 287 ptrdiff_t ref_counted_offset) |
287 { | 288 { |
288 auto it = classes.find(classID); | 289 auto it = classes.find(classID); |
289 if (it != classes.end()) | 290 if (it != classes.end()) |
290 throw std::runtime_error(std::string("Duplicate definition for class ") + name); | 291 throw std::runtime_error(std::string("Duplicate definition for class ") + name); |
291 | 292 |
292 ClassInfo* baseClass = nullptr; | 293 ClassInfo* baseClass = nullptr; |
293 if (baseClassID != TypeInfo<NoBaseClass>()) | 294 if (baseClassID != TypeInfo<NoBaseClass>()) |
294 { | 295 { |
295 it = classes.find(baseClassID); | 296 it = classes.find(baseClassID); |
296 if (it == classes.end()) | 297 if (it == classes.end()) |
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
639 | 640 |
640 template<typename ClassType, | 641 template<typename ClassType, |
641 typename BaseClass = bindings_internal::NoBaseClass, | 642 typename BaseClass = bindings_internal::NoBaseClass, |
642 typename std::enable_if<std::is_base_of<ref_counted, ClassType>::value>::typ e* = nullptr> | 643 typename std::enable_if<std::is_base_of<ref_counted, ClassType>::value>::typ e* = nullptr> |
643 class class_ | 644 class class_ |
644 { | 645 { |
645 public: | 646 public: |
646 class_(const char* name) | 647 class_(const char* name) |
647 { | 648 { |
648 ClassType* ptr = reinterpret_cast<ClassType*>(0x10000000); | 649 ClassType* ptr = reinterpret_cast<ClassType*>(0x10000000); |
649 int ref_counted_offset = | 650 ptrdiff_t ref_counted_offset = |
650 reinterpret_cast<int>(dynamic_cast<ref_counted*>(ptr)) - | 651 reinterpret_cast<char*>(static_cast<ref_counted*>(ptr)) - |
sergei
2017/03/20 17:07:15
Could we please use static_cast instead of dynamic
Wladimir Palant
2017/03/21 10:10:12
Done.
| |
651 reinterpret_cast<int>(ptr); | 652 reinterpret_cast<char*>(ptr); |
652 bindings_internal::register_class(name, | 653 bindings_internal::register_class(name, |
653 bindings_internal::TypeInfo<ClassType>(), | 654 bindings_internal::TypeInfo<ClassType>(), |
654 bindings_internal::TypeInfo<BaseClass>(), | 655 bindings_internal::TypeInfo<BaseClass>(), |
655 ref_counted_offset | 656 ref_counted_offset |
656 ); | 657 ); |
657 } | 658 } |
658 | 659 |
659 template<typename FieldType> | 660 template<typename FieldType> |
660 const class_& property(const char* name, | 661 const class_& property(const char* name, |
661 FieldType (ClassType::*getter)() const, | 662 FieldType (ClassType::*getter)() const, |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
717 | 718 |
718 std::vector<std::pair<int, std::string>> mapping; | 719 std::vector<std::pair<int, std::string>> mapping; |
719 for (const auto& item : list) | 720 for (const auto& item : list) |
720 mapping.emplace_back(item.first, item.second); | 721 mapping.emplace_back(item.first, item.second); |
721 | 722 |
722 bindings_internal::register_differentiator( | 723 bindings_internal::register_differentiator( |
723 bindings_internal::TypeInfo<ClassType>(), offset, mapping); | 724 bindings_internal::TypeInfo<ClassType>(), offset, mapping); |
724 return *this; | 725 return *this; |
725 } | 726 } |
726 }; | 727 }; |
LEFT | RIGHT |