/vczh_toys

This repository contains vczh's toys for black magic codes or experiments

Primary LanguageC++Apache License 2.0Apache-2.0

vczh_toys

This repository contains vczh's toys for black magic codes or experiments:

  • garbage collection library for C++11
  • multiple dimentional array for C++11
  • linq for C++11 and STL
  • Y function for writing recursive lambda expression

###./CppGarbageCollection ######// garbage collection library for C++

#include "gc_ptr.h"

using namespace vczh;

class Node : ENABLE_GC
{
public:
    gc_ptr<Node> next;
};

int main()
{
    gc_start(0x00100000, 0x00500000);
    {
        auto x = make_gc<Node>();
        auto y = make_gc<Node>();
        x->next = y;
        y->next = x;
        // static_gc_cast and dynamic_gc_cast is waiting for you who like doing pointer conversion
    }
    gc_force_collect(); // will search and delete x and y here
    gc_stop(); // will call gc_force_collect()
}

###./CppMultiDimentionArray ######// multiple dimentional array for C++

#include "array.h"

using namespace vczh;

int main()
{
	// int x[3][4][5]; but the lengths can be non-constant expressions
	array<int, 3> x((array_sizes(), 3, 4, 5));
	// first way to do x[1][2][3] = 10;
	x[1][2][3] = 10;
	// second way to do x[1][2][3] = 10;
	array_ref<int, 2> x1 = x[1];
	array_ref<int, 1> x2 = x1[2];
	int& x3 = x2[3];
	x3 = 10;
    return 0;
}

###./CppLinq ######// linq for C++11 and STL

#include "linq.h"
#include <iostream>

using namespace std;
using namespace vczh;

int main()
{
	{
		// calculate sum of squares of odd numbers
		int xs[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
		int sum = from(xs)
			.where([](int x){return x % 2 == 1; })
			.select([](int x){return x * x; })
			.sum();
		// prints 165
		cout << sum << endl;
	}
	{
		// iterate of squares of odd numbers ordered by the last digit
		vector<int> xs = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
		for (auto x : from(xs)
			.where([](int x){return x % 2 == 1; })
			.select([](int x){return x * x; })
			.order_by([](int x){return x % 10; })
			)
		{
			cout << x << " ";
		}
		// prints 1 81 25 9 49
		cout << endl;
	}
	{
		struct person
		{
			string		name;
		};

		struct pet
		{
			string		name;
			person		owner;
		};

		person magnus = { "Hedlund, Magnus" };
		person terry = { "Adams, Terry" };
		person charlotte = { "Weiss, Charlotte" };
		person persons[] = { magnus, terry, charlotte };

		pet barley = { "Barley", terry };
		pet boots = { "Boots", terry };
		pet whiskers = { "Whiskers", charlotte };
		pet daisy = { "Daisy", magnus };
		pet pets[] = { barley, boots, whiskers, daisy };

		auto person_name = [](const person& p){return p.name; };
		auto pet_name = [](const pet& p){return p.name; };
		auto pet_owner_name = [](const pet& p){return p.owner.name; };

		// print people and their animals in to levels
		/* prints
			Adams, Terry
				Barley
				Boots
			Hedlund, Magnus
				Daisy
			Weiss, Charlotte
				Whiskers
		*/
		for (auto x : from(persons).group_join(from(pets), person_name, pet_owner_name))
		{
			// x :: zip_pair<string, zip_pair<person, linq<pet>>>
			cout << x.second.first.name << endl;
			for (auto y : x.second.second)
			{
				cout << "    " << y.name << endl;
			}
		}

		// print people and their animals
		/* prints
			Adams, Terry: Barley
			Adams, Terry: Boots
			Hedlund, Magnus: Daisy
			Weiss, Charlotte: Whiskers
		*/
		for (auto x : from(persons).join(from(pets), person_name, pet_owner_name))
		{
			// x :: zip_pair<string, zip_pair<person, pet>>
			cout << x.second.first.name << ": " << x.second.second.name << endl;
		}
	}
}

###./CppRecursiveLambda ######// Y function for writing recursive lambda expression

#include "lambda.h"
#include <iostream>
#include <string>

using namespace std;
using namespace vczh;

int main()
{
	auto fib = Y([](function<int(int)> fib, int i)
	{
		return i < 2 ? 1 : fib(i - 1) + fib(i - 2);
	});

	for (int i = 0; i < 10; i++)
	{
		cout << fib(i) << ' ';
	}
	cout << endl;
}