Size: a a a

pro.graphon (and gamedev)

2020 March 30

MS

Mikola Summer Duck in pro.graphon (and gamedev)
Lain-dono
Правда иногда это может выглядеть немного странно. Тут fold принимает что-то похожее на функцию/замыкание, которое выглядит как fn(a: T, b: T) -> T
Это не замыкание, это указатель на функцию.
источник

MS

Mikola Summer Duck in pro.graphon (and gamedev)
Указатели на функции тоже реализуют Fn-трейты.
источник

MS

Mikola Summer Duck in pro.graphon (and gamedev)
Mikola Summer Duck
На плюсах теоретически можно сделать то же самое, но базовый класс придётся подбирать самому.
А ещё с мувами будут проблемы.
источник

d

disba1ancer in pro.graphon (and gamedev)
Mikola Summer Duck
Fn'ы в расте и есть собственно. Может ты имел ввиду наоборот?
я про подобное говорю:
class NonLockLoopTask {
 UINT_PTR timID;
 static void CALLBACK yieldTimer(HWND, UINT, UINT_PTR, DWORD) {
   ExecutionThread::getCurrentThread().yieldTasks();
 }
public:
 NonLockLoopTask() : timID(0) {}
 NonLockLoopTask(const NonLockLoopTask&) : NonLockLoopTask() {}
 NonLockLoopTask(NonLockLoopTask&& src) : timID(src.timID){
   src.timID = 0;
 }
 NonLockLoopTask& operator=(const NonLockLoopTask&) {
   timID = 0;
   return *this;
 }
 NonLockLoopTask& operator=(NonLockLoopTask&& src) {
   std::swap(timID, src.timID);
   return *this;
 }
 ~NonLockLoopTask() { if (timID) KillTimer(NULL, timID); }
 bool operator()() {
   MSG msg;
   if (!timID) {
     timID = SetTimer(NULL, 0, 10, yieldTimer);
   }
   while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
     if (msg.message == WM_QUIT) {
       ExecutionThread::getCurrentThread().exit(msg.wParam);
       return false;
     }
     if (!(msg.message == WM_TIMER || msg.wParam == timID)) {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
     }
   }
   return true;
 }
};
источник

L

Lain-dono in pro.graphon (and gamedev)
Mikola Summer Duck
Это не замыкание, это указатель на функцию.
Указатели на функции реализуют Fn-подобные трейты.
источник

MS

Mikola Summer Duck in pro.graphon (and gamedev)
Lain-dono
Указатели на функции реализуют Fn-подобные трейты.
Как я написал сообщением ниже.
источник

MS

Mikola Summer Duck in pro.graphon (and gamedev)
disba1ancer
я про подобное говорю:
class NonLockLoopTask {
 UINT_PTR timID;
 static void CALLBACK yieldTimer(HWND, UINT, UINT_PTR, DWORD) {
   ExecutionThread::getCurrentThread().yieldTasks();
 }
public:
 NonLockLoopTask() : timID(0) {}
 NonLockLoopTask(const NonLockLoopTask&) : NonLockLoopTask() {}
 NonLockLoopTask(NonLockLoopTask&& src) : timID(src.timID){
   src.timID = 0;
 }
 NonLockLoopTask& operator=(const NonLockLoopTask&) {
   timID = 0;
   return *this;
 }
 NonLockLoopTask& operator=(NonLockLoopTask&& src) {
   std::swap(timID, src.timID);
   return *this;
 }
 ~NonLockLoopTask() { if (timID) KillTimer(NULL, timID); }
 bool operator()() {
   MSG msg;
   if (!timID) {
     timID = SetTimer(NULL, 0, 10, yieldTimer);
   }
   while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
     if (msg.message == WM_QUIT) {
       ExecutionThread::getCurrentThread().exit(msg.wParam);
       return false;
     }
     if (!(msg.message == WM_TIMER || msg.wParam == timID)) {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
     }
   }
   return true;
 }
};
А, есть конечно. Разве что не нужно городить бойлерплейт мув-семантики.
источник

d

disba1ancer in pro.graphon (and gamedev)
Mikola Summer Duck
А, есть конечно. Разве что не нужно городить бойлерплейт мув-семантики.
а почему не нужно?
источник

MS

Mikola Summer Duck in pro.graphon (and gamedev)
Я тут подумал, даже в расте придётся делать аллокацию для такого случая, просто ты контроллируешь где и как она происходит.
источник

d

disba1ancer in pro.graphon (and gamedev)
Mikola Summer Duck
А, есть конечно. Разве что не нужно городить бойлерплейт мув-семантики.
думаешь раст знает как правильно мувнуть timID?
источник

MS

Mikola Summer Duck in pro.graphon (and gamedev)
disba1ancer
а почему не нужно?
Мув семантика вшита в язык. Объект = значение, в отличие от С++ объект = область памяти.
источник

d

disba1ancer in pro.graphon (and gamedev)
Mikola Summer Duck
Мув семантика вшита в язык. Объект = значение, в отличие от С++ объект = область памяти.
т.е. в расте деструктор никогда не вызовется над значением из которого мувнули?
источник

MS

Mikola Summer Duck in pro.graphon (and gamedev)
disba1ancer
думаешь раст знает как правильно мувнуть timID?
Благодаря сообщению выше, да, знает.
источник

MS

Mikola Summer Duck in pro.graphon (and gamedev)
disba1ancer
т.е. в расте деструктор никогда не вызовется над значением из которого мувнули?
Да. Более того, обращение к переменной (или месту) из которой мувнули — ошибка компиляции.
источник

d

disba1ancer in pro.graphon (and gamedev)
Mikola Summer Duck
Да. Более того, обращение к переменной (или месту) из которой мувнули — ошибка компиляции.
а это вообще возможно?
источник

MS

Mikola Summer Duck in pro.graphon (and gamedev)
disba1ancer
а это вообще возможно?
Деструкторы или трекинг мувов?
источник

MS

Mikola Summer Duck in pro.graphon (and gamedev)
Деструкторы возможны за счёт волшебного битфилда на стеке.
источник

d

disba1ancer in pro.graphon (and gamedev)
Mikola Summer Duck
Деструкторы или трекинг мувов?
обращение к переменной которую мувнули
источник

MS

Mikola Summer Duck in pro.graphon (and gamedev)
disba1ancer
обращение к переменной которую мувнули
Ты спрашиваешь „возможно ли обращаться к переменной, которую мувнули“ или „возможно ли это трекать и бросать ошибку“?
источник

L

Lain-dono in pro.graphon (and gamedev)
disba1ancer
обращение к переменной которую мувнули
Если прям очень-очень хочется, то на асме можно всё
источник