Re: better video rendering in d

2023-03-25 Thread Ogi via Digitalmars-d-learn

On Tuesday, 21 March 2023 at 16:57:49 UTC, monkyyy wrote:
My current method of making videos of using raylib to generate 
screenshots, throwing those screenshots into a folder and 
calling a magic ffmpeg command is ... slow.




Why not use ffmpeg as a library? Here are the 
[bindings](https://code.dlang.org/packages/ffmpeg-d).


Solving optimization problems with D

2023-01-01 Thread Ogi via Digitalmars-d-learn
I’ve read this [series if 
articles](https://www.gamedeveloper.com/design/decision-modeling-and-optimization-in-game-design-part-1-introduction) about using Excel Solver for all kinds of optimization problems. This is very neat, but of course, I would prefer to write models with code instead, preferably in D. I glanced at mir-optim but it requires knowledge of advanced math. Is there something more approachable for a layperson?


Re: Interfacing with basic C++ class

2022-09-30 Thread Ogi via Digitalmars-d-learn

On Thursday, 29 September 2022 at 12:49:06 UTC, Riccardo M wrote:

On Thursday, 29 September 2022 at 11:13:15 UTC, Ogi wrote:
So it turns out that D's structs are a much better match for 
C++'s classes in this case. But why is this? Can you elaborate? 
It must have to do with the fact that D structs are passed by 
value?




In C++, class and struct are basically the same thing (AFAIK the 
only difference is that struct members are public by default). In 
D, they are two very different things: classes are reference 
types — structs are value types, classes support inheritance — 
structs only support `alias this`, and so on.


When interfacing to C++, disregard the keyword and look at the 
implementation instead. If all its member functions are 
non-virtual, map it to struct. Otherwise map it to class. If it 
defines at least one pure virtual member function, map it to 
abstract class. If all its member functions are either pure 
virtual or non-virtual and it contains no fields, map it to 
interface. Sounds complicated? Well, that’s because C++ is 
complicated.


However the 'add' function only links correctly if C++ has the 
function body defined outside of its class.

```
// C++
int MyClass::add(int asd) {
return field + asd;
}
```
If the function is defined inside its class, it is an undefined 
reference at link time. Once again I ask for clarifications and 
workarounds, if possible.


In C++, member functions defined inside its class are called 
*inline* member functions. In contrast to normal functions which 
must be defined once and only once in your program, inline 
functions must be defined in every translation unit that uses 
them. Let’s replicate your linking error in C++:


```C++
//c.h
class C {
public:
int foo() {
return 42;
}
void bar();
};
```

```C++
//c.cpp
#include "c.h"

void C::bar() { /* ... */ }
```

```C++
//main.cpp
#include 

//Let’s see what happens if we forget `C::foo` definition:
class C {
public:
int foo();
void bar();
};

int main() {
auto c = new C();
printf("%d\n", c->foo());
c->bar();
return 0;
}
```

```
$ clang++ -c c.cpp
$ clang++ -c main.cpp
$ clang++ main.o c.o
main.o : error LNK2019: unresolved external symbol "public: int 
__cdecl C::foo(void)" (?foo@C@@QEAAHXZ) referenced in function 
main

a.exe : fatal error LNK1120: 1 unresolved externals
clang++: error: linker command failed with exit code 1120 (use -v 
to see invocation)

```

Copying `C::foo` definition to `main.cpp` will fix this. Of 
course, we could just include `c.h`.


Same goes for D. `MyClass.add` must be defined in your D module.


Re: Interfacing with basic C++ class

2022-09-29 Thread Ogi via Digitalmars-d-learn

On Wednesday, 28 September 2022 at 19:57:10 UTC, Riccardo M wrote:
I think I am stuck in the easiest of the issues and yet it 
seems I cannot get around this.

I have a C++ file:
```
class MyClass {
public:
int field;
MyClass(int a) : field(a) {}

int add(int asd) {
return asd + 1;
}
};
```


Ali is correct. However, you don’t have to change anything on the 
C++ side, just map C++ class to D struct:

```D
extern(C++, class) {
struct MyClass {
public: 
int field;
@disable this();
int add(int asd); //struct fields are always `final`
}

MyClass* instantiate(int asd); //mind the *
}
```


Re: Compile time int to string conversion in BetterC

2022-08-19 Thread Ogi via Digitalmars-d-learn

On Wednesday, 17 August 2022 at 10:38:33 UTC, Dennis wrote:

I had the same problem, and came up with the following trick:

```D
enum itoa(int i) = i.stringof;

enum major = 3;
enum minor = 2;
enum patch = 1;

enum versionString = itoa!major ~ "." ~ itoa!minor ~ "." ~ 
itoa!patch;


static assert(versionString == "3.2.1");
```


Nice! Thank you, I’ll use this.



Compile time int to string conversion in BetterC

2022-08-17 Thread Ogi via Digitalmars-d-learn
It’s 2022 already and BetterC still imposes limits at compile 
time and makes things awkward.


I have 3 integer enums that represents my library version. And I 
want to generate a "1.2.3" enum from them. This is a trivial 
thing to do in standard D but I can’t find a way to do it with 
BetterC enabled. I can’t use `to`, `text`, `sformat` or 
`toChars`, as none of them is compatible with BetterC. And I 
can’t use `sprintf` either because ‘stdc’ is not available at 
compile time.


On the other hand, string to integer conversion is simple: just 
‘mixin’ it! So as a workaround, I put numbers into private string 
enums, and the integer enums are generated from them. But this is 
not nice.


Maybe I’m missing something?


Re: So how do I find and remove an element from DList?

2020-07-10 Thread Ogi via Digitalmars-d-learn
On Friday, 10 July 2020 at 19:23:57 UTC, Steven Schveighoffer 
wrote:
It's not linear over the size of the list, it's linear over the 
size of the range.


If you are always removing 1 element, it's effectively O(1).

-Steve


I see. Thanks!


So how do I find and remove an element from DList?

2020-07-10 Thread Ogi via Digitalmars-d-learn

auto list = DList!int([1, 2, 3, 4]);
list.remove(list[].find(2).take(1));

Error: function 
std.container.dlist.DList!int.DList.remove(Range r) is not 
callable using argument types (Take!(Range))


It works if I replace `remove` with `linearRemove`, but that 
defeats the whole purpose of using a doubly linked list.


Can’t use UFCS to create InputRange?

2020-04-29 Thread Ogi via Digitalmars-d-learn

struct R {}
int front(R r) { return 42; }
void popFront(R r) {}
bool empty(R r) { return false; }

void main() {
import std.range.primitives : isInputRange;
static assert(isInputRange!R);
}


Error: static assert:  `isInputRange!(R)` is false


Whats really weird is that if I replace isInputRange with its 
definition from std.range.primitives, it returns true:


import std;

struct R {}
int front(R r) { return 42; }
void popFront(R r) {}
bool empty(R r) { return false; }

void main() {
static assert(is(typeof(R.init) == R)
&& is(ReturnType!((R r) => r.empty) == bool)
&& is(typeof((return ref R r) => r.front))
&& !is(ReturnType!((R r) => r.front) == void)
&& is(typeof((R r) => r.popFront)));
}
This compiles.

What’s going on here?


Re: Is there any writeln like functions without GC?

2019-11-12 Thread Ogi via Digitalmars-d-learn
If your goal is to debug your @nogc code, you can use writeln in 
debug statement:


@nogc void main() {
debug writeln("hello, debug world!");
}