= meow


== Description
一個不需要, 也不應該先compile成obj files的templates.

.Links
* https://github.com/cathook/meow[GitHub]
* http://www.csie.ntu.edu.tw/~b01902109/readme/template_meow/README.html[README.html]
* https://github.com/cathook/meow/archive/master.zip[Download]

== File Tree



=== LaTex/


LaTex 相關模板

===== Makefile

環境變數:

* `SOURCE = source.tex` 設定 'LaTex' 源碼檔名
* `TARGET = output` 設定生出來的 *pdf* 檔名

[NOTE]
`TARGET` 不需要給副檔名

targets:

* `all` 生成 *'<TARGET>'.pdf*
* `view` 用kde-open 把輸出結果開起來(如有需要會先重新編譯)
* `clean` 清除
* `two` 編譯兩次, 如果有目錄的話可能會需要用到

===== source.tex

內容為一些我自己定義的設定, 參數設置等等. 另外還有用寫在註解裡面的小筆記



=== asciidoc/

一些關於asciidoc的example與編譯設定

===== Makefile

編譯asciidoc用的, 裡面有兩個環境變數:

- ASCIIDOC_SOURCE: 指定原始碼, 預設為 'example.txt'
- ASCIIDOC_OUTPUT: 輸出的檔名, 預設為 'output.html'

另外還有一個target:

[source,makefile]
---------------
$(ASCIIDOC_OUTPUT): $(ASCIIDOC_SOURCE)
---------------



=== cppMakefile/



.Description

這是一個簡單的 *GNU makefile for 'C++' project*
類似AutoTool等工具, 不過又更簡化了, 操作方法是利用GNUMakefile裡的targets
當作指令, 生出一個targets檔, 以後鍵入 `make all` 就會自動把所有targets都
編譯出來.

.Commands

* `make init` +
初始化, 設定完之後所在位置會多幾個資料夾如下

** 'bin/' 放編譯出來的執行檔
** 'dep/' dependency相關資料, 內容會自動生成, 不用理它
** 'inc/' 自定義的include file放置位置
** 'src/' source code放置位置
** 'obj/' obj file放置位置, 會自動生成, 不用理它

* `make new NAME=<name> [OBJS=<OBJ_FILES> LIBS=<LIBRARIES>]` +
新增一個target, 須給定目標名 , 並且此Makefile會假定 `main() { ... }` 放在
'src/<name>.cpp' 而最終輸出會是 'bin/<name>' . +
關於 'OBJS=' 與 'LIBS=' 參考下面說明

* `make add NAME=<name> [OBJS=<OBJ_FILES> LIBS=<LIBRARIES>]` +
針對target為 '<name>' 的目標新增需要的 '<OBJ_FILES>' , 與 '<LIBRARIES>'. 
'<LIBRARIES>' 的部份會用 `pkg-config` 去解讀, 例如 '<LIBRARIES>' 為
'opencv lapackpp' 則link時會被以下指令展開 +
`pkg-config --libs opencv lapackpp` +
而 '<OBJ_FILES>' 的部份則只需要給 *name* 就好, 不需要有完整個 pathname, 例如
例如 '<OBJ_FILES>' 是 'a b c' 則此makefile會視為

** source code: 'src/a.cpp src/b.cpp src/c.cpp'
** obj file: 'obj/a.o obj/b.o obj/c.o'

* `make del NAME=<name> [OBJS=<OBJ_FILES> LIBS=<LIBRARIES>]` +
與 add相反, 嘗試將指定target所需的'<OBJ_FILES>'和'<LIBRARIES>'移除

* `make clean` +
將 'bin/*' 'dep/*' 'obj/*' 清除, 有時候覺得dependency怪怪的
時可以嘗試執行此指令

[NOTE]
其中整個project到底有哪些obj file會完全依照 *src/* 裡面有哪些 `.cpp` 檔決定

===== GNUMakefile

就是一個 Makefile, 不過裡面有些東西是 `GNU-make` only的

===== GNUMakefile.dependency.bash

產生 dependency檔用的



=== doxygen/


doxygen 相關設定

===== Makefile

編譯doxygen document的Makefile, 裡面只有一個target: 'document',
另外有兩個環境變數:

- DOXYGEN_RUN_PATH: 指定doxygen執行的pwd, 預設為 `pwd`
- DOXYGEN_CONFIG: 指定config檔放在哪裡, 預設為 `pwd`

===== config

設置, 以下幾點個人覺得比較重要的

[source,conf]
-------------------------

#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
DOXYFILE_ENCODING      = UTF-8
PROJECT_NAME           = "Templates -- Meow"
PROJECT_NUMBER         = 1.1.2
PROJECT_BRIEF          = 不能, 也不應該先編譯成obj-file的templates
PROJECT_LOGO           = $(config_path)/logo.png
OUTPUT_DIRECTORY       = doc
CREATE_SUBDIRS         = NO
OUTPUT_LANGUAGE        = English
TAB_SIZE               = 2

#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
EXTRACT_ALL            = YES
EXTRACT_STATIC         = YES
EXTRACT_LOCAL_CLASSES  = NO
EXTRACT_LOCAL_CLASSES  = YES
FORCE_LOCAL_INCLUDES   = YES

#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
INPUT                  = meowpp
INPUT_ENCODING         = UTF-8
FILE_PATTERNS          =
RECURSIVE              = YES

#---------------------------------------------------------------------------
# configuration options related to the HTML output
#---------------------------------------------------------------------------
GENERATE_HTML          = YES
HTML_OUTPUT            = html
HTML_FILE_EXTENSION    = .html
HTML_HEADER            = $(config_path)/header.html
HTML_FOOTER            = $(config_path)/footer.html
HTML_STYLESHEET        = $(config_path)/stylesheet.css
HTML_EXTRA_STYLESHEET  = $(config_path)/custom.css
HTML_EXTRA_FILES       =
HTML_COLORSTYLE_HUE    = 120
HTML_COLORSTYLE_SAT    = 36
HTML_COLORSTYLE_GAMMA  = 166
DISABLE_INDEX          = YES
GENERATE_TREEVIEW      = YES
FORMULA_FONTSIZE       = 11
SEARCHENGINE           = NO

#---------------------------------------------------------------------------
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------
GENERATE_LATEX         = YES
LATEX_CMD_NAME         = xelatex
PAPER_TYPE             = letter
HIDE_UNDOC_RELATIONS   = NO
UML_LOOK               = YES
EXTRA_PACKAGES         =
LATEX_HEADER           = $(config_path)/header.tex
LATEX_FOOTER           = $(config_path)/footer.tex

#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
CALL_GRAPH             = YES
CALLER_GRAPH           = YES
-------------------------

[NOTE]
'config' 中 `$(config_path)` 是一個環境變數, 代表這個configure file所在位置
*呼叫asciidoc時必須有設置這個環境變數*


===== header.html

*HTML* output 的開頭
沒有更動

===== footer.html

*HTML* output 的結尾
沒有更動

===== logo.png

就是logo


===== stylesheet.css

*HTML* output 的css樣式, 我把他改成暗色系了

以下是更動的地方:
[source,css]
----------------------------------------------
body, table, div, p, dl {
	font: 400 14px/19px Roboto,sans-serif,monospace;
}

.title {
	line-height: 100%;
	font-size: 200%;
	margin :  0px;
	padding: 0px;
	border : 0px;
}

dt {
	color: #999999;
	font-style:italic;
}

div.qindex, div.navtab{
	background-color: #2B3F26;
}

a {
	color: #5D77AC;
}

.contents a:visited {
	color: #7695D2;
}

a.code, a.code:visited {
	color: #7695D2; 
}

a.codeRef, a.codeRef:visited {
	color: #7695D2; 
}

pre.fragment {
        background-color: #0B0C0D;
        border-radius: 4px;
        -moz-border-radius: 4px;
        -webkit-border-top-left-radius: 4px;
}

div.fragment {
	background-color: #0B0C0D;
        border-radius: 4px;
        -moz-border-radius: 4px;
        -webkit-border-top-left-radius: 4px;
}

div.line {
	font-family: 'courier new', monospace, fixed;
	color: #CCCCCC;
        font-size: 14px;
	min-height: 14px;
}

span.lineno {
	background-color: #181818;
}
span.lineno a {
	background-color: #3B3838;
}

span.lineno a:hover {
	background-color: #6B6868;
}

body {
	background-color: #212131;
	color: #DDFFDD;
}

span.keyword {
	color: #00A000
}

span.keywordtype {
	color: #907050
}

span.comment {
	color: #808080
}

table.memberdecls {
	border-top-color: #111111;
}

.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
	background-color: #192322;
}

.mdescLeft, .mdescRight {
	color: #CCCCCC;
}

.memTemplParams {
	color: #7695D2;
}

.memtemplate {
	color: #7695D2;
}

.memproto, dl.reflist dt {
        color: #758575;
        text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.95);
        /* background-image:url('nav_f.png'); */
        background-color: #181C28;
}

.memdoc, dl.reflist dd {
        /* background-image:url('nav_g.png'); */
        background-color: #131923;
}

.params .paramdir {
	color:#A0AA00;
}

.directory tr.even {
	background-color: #272838;
}

.directory .levels span {
	color: #5D77AC;
}

div.header
{
        /* background-image:url('nav_h.png'); */
        /* background-repeat:repeat-x; */
	background-color: #290A1C;
	padding: 0px;
	margin : 0px;
	border : 0px;
	margin-top: 10px;
	border-bottom: 1px solid #AA0000;/*#C4CFE5;*/
}

div.headertitle
{
	padding: 5px;
	margin : 0px;
	border : 0px;
}
 
#projectname
{
	font: 400% Tahoma, Arial,sans-serif,monospace;
}

div.toc h3 {
	color: #7695D2;
}

----------------------------------------------

===== custom.css

*HTML* output 的css樣式, 在這邊設定的話連 'navtree' 等都可以設定. +
另外這個檔案的檔名不能是 `navtree.css` , 不知道是不是bug.

===== header.tex

*LaTex* output 的開頭

===== header.tex

*LaTex* output 的結尾

===== stylesheet.sty

*LaTex* 的樣式設定


=== meowpp/

meow for *C++ templates*


===== Self.h

包含一個具有 *Copy On Write* 技術的 'class' 而且有實作 *by reference* ,
基本上就是改良C\+\+原本的 reference 機制, 原本的 reference 只能在宣告的時候
指定參照指向的變數,
而這邊則可以動態改變


===== Usage.h

方便user製作還算精美的 *usage document* 並且利用 `getopt()` 實作讀入參數與分析

===== utility.h

一些不知道要歸類到哪的小functions


==== colors/


一些 *color space* 以及這些space的 *transformate function* 都放在這資料夾下

[NOTE]
目前transformation function的準確率還很低, 有待以後加強

===== Color3_Space.h

`class Color3_Space<T>` *Channel Number = 3* 的 Color Space 的共通 *Base class*

===== RGB_Space.h

Channel分別是

* Red
* Green
* Blue

.Classes
* `meow::RGBi_Space` 用 'int' 存資料, 每個channel數值合法範圍是 *0~255*
* `meow::RGBf_Space` 用 'double' 存資料, 每個channel數值合法範圍是 *0.0~1.0*

.Functions
* `meow::colorTransformation(in, *out)` for
** RGBi_Space <--> RGBf_Space

===== YUV_Space.h

Channel分別是

* Y 明度
* U 色度
* V 濃度

.Classes
* `meow::YUVf_Space` 用 'double' 存資料, 每個channel數值合法範圍是 *0~1.0*

.Functions
* `meow::colorTransformation(in, *out)` for
** YUVf_Space <--> RGBi_Space
** YUVf_Space <--> RGBf_Space

===== HSL_Space.h

Channel分別是

* H 色調
* S 飽和度
* L 亮度

.Classes
* `meow::HSLf_Space` 用 'double' 存資料, 每個channel數值合法範圍是 *0~1.0*

.Functions
* `meow::colorTransformation(in, *out)` for
** HSLf_Space <--> RGBi_Space
** HSLf_Space <--> RGBf_Space
** HSLf_Space <--> YUVf_Space

===== HSV_Space.h

Channel分別是

* H 色調
* S 飽和度
* V 亮度

.Classes
* `meow::HSVf_Space` 用 'double' 存資料, 每個channel數值合法範圍是 *0~1.0*

.Functions
* `meow::colorTransformation(in, *out)` for
** HSVf_Space <--> RGBi_Space
** HSVf_Space <--> RGBf_Space
** HSVf_Space <--> YUVf_Space
** HSVf_Space <--> HSLf_Space


==== dsa/


包含一些資料結構

===== BinaryIndexTree.h

極度簡化的 *SegmentTree* 已無區間更新的操作.

.Classes
* `meow::BinaryIndexTree<Value>`

===== DisjointSet.h

用來維護一堆互斥集的資訊.

.Classes
* `meow::DisjointSet`

===== HashTable.h

就是傳說中的HashTable

.Classes
* `meow::HashTableList<Data, HashFunc>`

===== KD_Tree.h

查詢第k近鄰居用的

.Classes
* `meow::KD_Tree<Vector>`

===== MergeableHeap.h

可合併Heap

.Classes
* `meow::MergeableHeap<Element>`

===== SegmentTree.h

線段樹
.Classes
* `meow::SegmentTree<Value>`

===== SplayTree.h

伸展樹, 比一般平衡樹稍強的東東
* `meow::SplayTree<Key, Value>`
* `meow::SplayTree_Range<Key, Value>`

===== VP_Tree.h

查詢第k近鄰居用的

.Classes
* `meow::VP_Tree<Vector>`

==== geo/

計算幾何相關, 算是從math中特化出來的

===== Vectors.h

實作上不是用陣列, 是直接宣告2到3個變數分別存x, y (,z)

.Classes
* `meow::Vector2D<Scalar>`
* `meow::Vector3D<Scalar>`



==== math/


===== utility.h

數學相關的小 function 雜七雜八的不知道歸類何處

.Functions
* noEPS()
* normalize()
* denormalize()
* ratioMapping()
* inRange()
* squ()
* cub()
* average()
* average()
* tAbs()

.Constants
* PI

===== Matrix.h

.Classes
* `meow::Matrix<Entry>`

===== Vector.h

實作上將 *Matrix* 重新包裝

.Classes
* `meow::Vector<Scalar>`

===== Transformation.h

各種轉換的 Base Class, 這裡所謂的 *Transformation* 形式上不一定要是 Linear, 
但原則上都是 *input a vector, output a vector* 其中input/output的dimension可以
不同.

.Classes
* `meow::Transformation<Scalar>`

===== Transformations.h

包含各種 *Non-Linear* transformation

.Classes
* `meow::BallProjection<Scalar>`
* `meow::PhotoProjection<Scalar>`

===== LinearTransformation.h

各種 LinearTransformation 的Base Class, 繼承自 `meow::Transformation`

.Classes
* `meow::LinearTransformation<Scalar>`

===== LinearTransformations.h

各種 *Linear* Transformation

.Classes
* `meow::Rotation3D<Scalar>`

===== methods.h

一些數學方法

.Functions
* ransac()
* levenbergMarquardt()



==== oo/

物件相關

===== ObjBase.h

.Classes
* `meow::ObjBase`

===== ObjTypes.h

.Classes
* `meow::ObjType`
* `meow::ObjInt`
* `meow::ObjSizeT`
* `meow::ObjDouble`
* `meow::ObjString`

===== ObjArray.h

.Classes
* `meow::ObjArray`

===== ObjDictionary.h

.Classes
* `meow::ObjDictionary`

===== ObjSelector.h

.Classes
* `meow::ObjSelector<SID>`


== Test
=== ACM 相關題目
[options="header",width="70%",cols="3<s,3<,4^,1^,1<,2^m",grid="rows"]
|=======================================================================
| Name          | Problem               | Link  | Status | Time | source
| KD_Tree       | 'Retrenchment' |
http://acm.csie.org/ntujudge/problem.php?id=1971[NTU-OJ]
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4052[ACM-ICPC Live]
| Accept | 0.083/0.083 | http://codepad.org/U85ruse5[codepad]


| VP_Tree       | 'Retrenchment' |
http://acm.csie.org/ntujudge/problem.php?id=1971[NTU-OJ]
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4052[ACM-ICPC Live]
| Accept | 0.516/0.516 | http://codepad.org/03dW6ZHV[codepad]


| SplayTree + SegmentTree | 'Shuffling_cards' |
http://acm.csie.org/ntujudge/problem.php?id=1353[NTU-OJ]
http://www.spoj.com/problems/SHUFFLEK/[SPOJ]
| Accept/TLE | 6.910/--- | http://codepad.org/yUeiVZc0[codepad]

| SplayTree + BinaryIndexTree | 'Shuffling_cards' |
http://acm.csie.org/ntujudge/problem.php?id=1353[NTU-OJ]
http://www.spoj.com/problems/SHUFFLEK/[SPOJ]
|Accept/Accept|5.480/44.35| http://codepad.org/GAWjEtmq[codepad]



|=======================================================================




== Bug Report / Contact
  * E-Mail: cat.hook31894 \~在~ gmail.com
  * GitHub
