aboutsummaryrefslogtreecommitdiffstats
path: root/meowpp
diff options
context:
space:
mode:
authorcathook <b01902109@csie.ntu.edu.tw>2014-05-02 04:10:56 +0800
committercathook <b01902109@csie.ntu.edu.tw>2014-05-02 04:10:56 +0800
commit33d419e4d54d969798af80f05e05f0c447a99594 (patch)
treec78355a2d334e34df865aca865dbb4864a85820c /meowpp
parentd2d7a49563a8f04bd07264a4a989d5656313d375 (diff)
downloadmeow-33d419e4d54d969798af80f05e05f0c447a99594.tar
meow-33d419e4d54d969798af80f05e05f0c447a99594.tar.gz
meow-33d419e4d54d969798af80f05e05f0c447a99594.tar.bz2
meow-33d419e4d54d969798af80f05e05f0c447a99594.tar.lz
meow-33d419e4d54d969798af80f05e05f0c447a99594.tar.xz
meow-33d419e4d54d969798af80f05e05f0c447a99594.tar.zst
meow-33d419e4d54d969798af80f05e05f0c447a99594.zip
big change about dir structure
Diffstat (limited to 'meowpp')
-rw-r--r--meowpp/dsa/KD_Tree.h2
-rw-r--r--meowpp/dsa/KD_Tree.hpp16
-rw-r--r--meowpp/dsa/SegmentTree.hpp2
-rw-r--r--meowpp/dsa/VP_Tree.hpp19
-rw-r--r--meowpp/oo/ObjBase.h8
-rw-r--r--meowpp/oo/ObjPort.h18
-rw-r--r--meowpp/oo/ObjPort.hpp47
-rw-r--r--meowpp/oo/ObjSelector.h11
8 files changed, 103 insertions, 20 deletions
diff --git a/meowpp/dsa/KD_Tree.h b/meowpp/dsa/KD_Tree.h
index b4e579c..dcb60a7 100644
--- a/meowpp/dsa/KD_Tree.h
+++ b/meowpp/dsa/KD_Tree.h
@@ -75,7 +75,7 @@ namespace meow{
void query(Vector const& __vector,
size_t __nearestNumber,
AnswerCompare const& __answerCompare,
- size_t __index,
+ ssize_t __index,
int __depth,
std::vector<Scalar>& __dist2Vector,
Scalar __dist2Minimum,
diff --git a/meowpp/dsa/KD_Tree.hpp b/meowpp/dsa/KD_Tree.hpp
index 735d4af..824b917 100644
--- a/meowpp/dsa/KD_Tree.hpp
+++ b/meowpp/dsa/KD_Tree.hpp
@@ -84,14 +84,14 @@ namespace meow{
////////////////////////////////////////////////////////////////////
template<class Vector, class Scalar>
inline void
- KD_Tree<Vector, Scalar>::query(Vector const& __vector,
- size_t __nearestNumber,
+ KD_Tree<Vector, Scalar>::query(Vector const& __vector,
+ size_t __nearestNumber,
AnswerCompare const& __answerCompare,
- size_t __index,
- int __depth,
+ ssize_t __index,
+ int __depth,
std::vector<Scalar>& __dist2Vector,
Scalar __dist2Minimum,
- Answers *__out) const{
+ Answers* __out) const{
if(__index == _NIL) return ;
size_t cmp = __depth % _dimension;
ssize_t this_side, that_side;
@@ -144,7 +144,7 @@ namespace meow{
for(ssize_t i = mid + 1; i <= __end; i++){
__orders[which_side][__orders[cmp][i]] = 1;
}
- for(int i = 0; i < _dimension; i++){
+ for(size_t i = 0; i < _dimension; i++){
if(i == cmp) continue;
size_t left = __beg, right = mid + 1;
for(int j = __beg; j <= __end; j++){
@@ -216,10 +216,10 @@ namespace meow{
inline void
KD_Tree<Vector, Scalar>::forceBuild(){
std::vector<size_t> *orders = new std::vector<size_t>[_dimension + 2];
- for(int j = 0; j < _dimension + 2; j++){
+ for(size_t j = 0; j < _dimension + 2; j++){
orders[j].resize(_nodes.size());
}
- for(int j = 0; j < _dimension; j++){
+ for(size_t j = 0; j < _dimension; j++){
for(size_t i = 0, I = _nodes.size(); i < I; i++){
orders[j][i] = i;
}
diff --git a/meowpp/dsa/SegmentTree.hpp b/meowpp/dsa/SegmentTree.hpp
index bdd43fb..15ac0ef 100644
--- a/meowpp/dsa/SegmentTree.hpp
+++ b/meowpp/dsa/SegmentTree.hpp
@@ -70,7 +70,7 @@ namespace meow{
template<class Value>
inline bool
SegmentTree<Value>::rangeCorrect(ssize_t* __first, ssize_t* __last) const{
- if(*__last<*__first || *__last<0 || _size-1<*__first) return false;
+ if(*__last<*__first || *__last<0 || (ssize_t)_size-1<*__first) return false;
*__first = inRange((ssize_t)0, (ssize_t)_size - 1, *__first);
*__last = inRange((ssize_t)0, (ssize_t)_size - 1, *__last );
return true;
diff --git a/meowpp/dsa/VP_Tree.hpp b/meowpp/dsa/VP_Tree.hpp
index 2026050..bb6b5f1 100644
--- a/meowpp/dsa/VP_Tree.hpp
+++ b/meowpp/dsa/VP_Tree.hpp
@@ -69,8 +69,6 @@ namespace meow{
VP_Tree<Vector, Scalar>::split(ssize_t __first, ssize_t __last,
size_t __order, Vector const& __center){
ssize_t first0 = __first;
- ssize_t last0 = __last;
- ssize_t order0 = __order;
std::vector<Scalar> dist2(__last - __first + 1);
for(ssize_t i = __first; i <= __last; i++){
dist2[i - first0] = distance2(_vectors[i], __center);
@@ -79,10 +77,10 @@ namespace meow{
size_t threshold_index = __first + rand() % (__last - __first + 1);
Scalar threshold(dist2[threshold_index - first0]);
size_t large_first = __last + 1;
- for(size_t i = __first; __first <= large_first - 1; large_first--){
+ for(ssize_t i=__first; __first<=(ssize_t)large_first-1; large_first--){
if(threshold < dist2[large_first - 1 - first0]) continue;
- while(i < large_first - 1 && !(threshold < dist2[i - first0])) i++;
- if(i < large_first - 1){
+ while(i < (ssize_t)large_first-1&&!(threshold < dist2[i-first0])) i++;
+ if(i < (ssize_t)large_first - 1){
std::swap(dist2 [large_first - 1 - first0], dist2 [i - first0]);
std::swap(_vectors[large_first - 1 ], _vectors[i ]);
i++;
@@ -90,10 +88,10 @@ namespace meow{
break;
}
}
- if(large_first == __last + 1){
+ if(large_first == (size_t)__last + 1){
std::swap(dist2 [threshold_index-first0], dist2 [__last-first0]);
std::swap(_vectors[threshold_index ], _vectors[__last ]);
- if(__order == __last - __first){
+ if((ssize_t)__order == __last - __first){
__first = __last;
break;
}
@@ -182,15 +180,18 @@ namespace meow{
template<class Vector, class Scalar>
inline
VP_Tree<Vector, Scalar>::VP_Tree(VP_Tree<Vector, Scalar> const& __tree2):
- _root(dup(__tree2._root)),
_vectors(__tree2._vectors),
+ _root(dup(__tree2._root)),
_dimension(__tree2._dimension),
_needRebuild(__tree2._needRebuild){
}
template<class Vector, class Scalar>
inline
VP_Tree<Vector, Scalar>::VP_Tree(size_t __dimension):
- _root(NULL), _vectors(0), _dimension(0), _needRebuild(false){
+ _vectors(0),
+ _root(NULL),
+ _dimension(0),
+ _needRebuild(false){
reset(__dimension);
}
template<class Vector, class Scalar>
diff --git a/meowpp/oo/ObjBase.h b/meowpp/oo/ObjBase.h
index 2c8cb70..3aa99d7 100644
--- a/meowpp/oo/ObjBase.h
+++ b/meowpp/oo/ObjBase.h
@@ -1,6 +1,8 @@
#ifndef oo_ObjBase_H__
#define oo_ObjBase_H__
+#include <cstdio>
+
#include <typeinfo>
#include <string>
@@ -11,7 +13,11 @@ namespace meow{
public:
virtual ~ObjBase(){ }
//
- virtual ObjBase* create() const = 0;
+ virtual bool read (FILE* f, bool bin, unsigned int fg){ return false; }
+ virtual bool write(FILE* f, bool bin, unsigned int fg){ return false; }
+ //
+ virtual ObjBase* create() const{ return NULL; }
+ //
virtual char const* ctype() const{
static char const* ptr = typeid(*this).name();
return ptr;
diff --git a/meowpp/oo/ObjPort.h b/meowpp/oo/ObjPort.h
new file mode 100644
index 0000000..b9baf0c
--- /dev/null
+++ b/meowpp/oo/ObjPort.h
@@ -0,0 +1,18 @@
+#ifndef oo_ObjPort_H__
+#define oo_ObjPort_H__
+
+#include "ObjBase.h"
+
+#include <cstdio>
+
+namespace meow{
+ template<size_t sid>
+ class ObjPort{
+ public:
+ static ObjBase* read (FILE* __f, bool __binary);
+ static bool write(FILE* __f, bool __binary,
+ ObjBase* __obj, unsigned int __fg);
+ };
+}
+
+#endif // oo_ObjPort_H__
diff --git a/meowpp/oo/ObjPort.hpp b/meowpp/oo/ObjPort.hpp
new file mode 100644
index 0000000..d458adf
--- /dev/null
+++ b/meowpp/oo/ObjPort.hpp
@@ -0,0 +1,47 @@
+#include "ObjPort.h"
+
+#include "ObjSelector.h"
+#include "ObjBase.h"
+
+#include <cstdio>
+
+namespace meow{
+ template<size_t sid>
+ inline ObjPort::ObjBase* read(FILE* __f, bool __binary){
+ char name[1024];
+ unsigned int fg;
+ if(__binary){
+ size_t len;
+ if(fread(&len, sizeof(size_t), 1, __f) < 1) return NULL;
+ if(fread(name, sizeof(char), len, __f) < len) return NULL;
+ if(fread(&fg, sizeof(unsigned int), 1, __f) < 1) return NULL;
+ name[len] = '\0';
+ }else{
+ fscanf(__f, "%s %u", name, &fg);
+ }
+ ObjBase* ret = Selector<sid>(name);
+ if(ret->read(__f, __binary, fg) == false){
+ delete ret;
+ ret = NULL;
+ }
+ return ret;
+ }
+
+
+ template<size_t sid>
+ inline ObjPort::bool write(FILE* __f, bool __binary,
+ ObjBase* __obj, unsigned int __fg){
+ std::string name = Selector<sid>::find(__obj);
+ if(__binary){
+ size_t len = name.size();
+ if(fwrite(&len, sizeof(size_t), 1, __f) < 1) return false;
+ if(fwrite(name.c_str(), sizeof(char), len, __f) < len) return false;
+ if(fwrite(&__fg, sizeof(unsigned int), 1, __f) < len) return false;
+ }else{
+ if(fprintf(__f, "%s %u\n", name.c_str(), __fg) < 2) return false;
+ }
+ return __obj->write(__f, __binary, __fg);
+ }
+}
+
+#endif // oo_ObjPort_H__
diff --git a/meowpp/oo/ObjSelector.h b/meowpp/oo/ObjSelector.h
index e70c496..58debcb 100644
--- a/meowpp/oo/ObjSelector.h
+++ b/meowpp/oo/ObjSelector.h
@@ -34,11 +34,22 @@ namespace meow{
funcs().erase(s);
}
}
+ static ObjBase const* access(std::string s){
+ if(funcs().find(s) == funcs().end()) return NULL;
+ return funcs()[s];
+ }
static ObjBase* get(std::string s){
if(funcs().find(s) == funcs().end() || funcs()[s] == NULL)
return NULL;
return funcs()[s]->create();
}
+ static std::string find(ObjBase* o){
+ for(Funcs::iterator it = funcs().begin(); it != funcs().end(); it++)
+ if(it->second != NULL && it->second->type() == o->type()){
+ return it->first;
+ }
+ return std::string();
+ }
static Types lst(){
Types ret;
for(Funcs::iterator it = funcs().begin(); it != funcs().end(); it++)