//ControlStructure.h
#pragma once
template<bool Cond, class Then, class Else>
struct make_if {
using result = typename Then;
};
template<class Then, class Else>
struct make_if<false, Then, Else> {
using result = typename Else;
};
template<bool Cond, class Then, class Else>
using _If = typename make_if<Cond, Then, Else>::result; //延迟求值
template<bool Cond, class Then, class Else>
using If = typename _If<Cond, Then, Else>::result; //立即求值
//DataType.h
#pragma once
template<int N>
struct Int { static int const result = N; };
//list.h
//下面开头带_为延迟求值, 否则是立即求值
#pragma once
#include "ControlStruct.h"
struct Null { using result = Null; };
//-------------定义序对--------------
template<class left, class right>
struct Cons {
using result = Cons<left, right>;
using car = left;
using cdr = right;
enum { length = cdr::length + 1 };
};
template<class left>
struct Cons<left, Null> {
using result = Cons<left, Null>;
using car = left;
using cdr = Null;
enum { length = 1 };
};
//-----------------------------------
//-------------定义链表--------------
template<class head, class ...tail>
struct make_list {
using result = Cons<head, typename make_list<tail...>::result>;
};
template<class head>
struct make_list<head> {
using result = Cons<head, Null>;
};
template<class ...Arg>
using List = typename make_list<Arg...>::result;
//-----------------------------------
template<class cons>
struct _Car {
using result = typename cons::car;
};
template<class cons>
using Car = typename _Car<cons>::result;
template<class cons>
struct _Cdr {
using result = typename cons::cdr;
};
template<class cons>
using Cdr = typename _Cdr<cons>::result;
template<class cons>
struct _Length {
enum{ result = cons::length };
};
template<class cons>
using Length = typename _Length<cons>::result;
//-------------链表查找--------------
template<class list, int n>
struct _Find {
using result = typename _Find<typename list::cdr, n - 1>::result;
};
template<class head>
struct _Find<make_list<head>, 0> {
using result = typename make_list<head>::car;
};
template<class list>
struct _Find<list, 0> {
using result = typename list::car;
};
template<class list, int n>
using Find = typename _Find<list, n>::result;
//-----------------------------------
//-------------链表拷贝--------------
template<class list, int start , int end>
struct _Copy {
using result = Cons<Find<list, start>,
typename _Copy<typename list::cdr, start, end - 1>::result>;
};
template<class list, int start>
struct _Copy<list, start, start> {
using result = Cons<Find<list, start>, Null>;
};
template<class list, int start, int end>
using Copy = typename _Copy<list, start, end>::result;
//-----------------------------------
//-------------链表合并--------------
template<class T, class ...Arg>
struct _Append {
template<class cons1, class cons2>
struct make_append {
using result = Cons<typename cons1::car,
typename make_append<typename cons1::cdr, cons2>::result>;
};
template<class cons2>
struct make_append<Null, cons2> {
using result = Cons<typename cons2::car,
typename make_append<Null, typename cons2::cdr>::result>;
};
template<>
struct make_append<Null, Null> {
using result = Null;
};
using result = typename make_append<T, typename _Append<Arg...>::result>::result;
};
template<class list>
struct _Append<list> {
using result = list;
};
template<class T, class ...Arg>
using Append = typename _Append<T, Arg...>::result;
//-----------------------------------
//-------------链表修改--------------
template<class list, int index, class val>
struct _Change {
using result = Append<Copy<list, 0, index - 1>,
Cons<val,
If<(index == list::length - 1),
Null,
_Copy<list, index + 1, list::length - 1>>>>;//延迟求值
};
template<class list, class val>
struct _Change<list, 0, val> {
using result = Append<Null,
Cons<val,
Copy<list, 1, list::length - 1>>>;
};
template<class list, int index, class val>
using Change = typename _Change<list, index, val>::result;
//-----------------------------------*
template<class list, int a, int b>
struct _Swap {
using result = Change<Change<list,a,Find<list, b>>,b, Find<list, a>>;
};
template<class list, int a, int b>
using Swap = typename _Swap<list, a, b>::result;