#pragma once
#include <memory>
#include <list>
#include <algorithm>
class N_class{
public:
friend struct finder_N_class;
//friend class relation_class;
const CString& get_value(void)const
{
return m_TBLName;
}
N_class& operator =(const N_class& N_obj)
{
m_TBLName=N_obj.m_TBLName;
return *this;
}
N_class(const N_class& N_obj)
{
m_TBLName=N_obj.m_TBLName;
};
N_class(const CString& TBName)
{
m_TBLName=TBName;
};
private:
CString m_TBLName;
};
typedef struct finder_N_class
{
finder_N_class(const std::shared_ptr<N_class>& N_obj)
{
m_N_obj=N_obj;
}
bool operator()(std::shared_ptr<N_class> p)
{
return (m_N_obj->m_TBLName == p->m_TBLName);
}
std::shared_ptr<N_class> m_N_obj;
}finder_N_class;
class One_class
{
public:
int iOtherTaxerCount;//没有计划好的成员,去掉并不影响这个类的功能
friend struct finder_relation_One_class;
//friend class relation_class;
One_class& operator =(const One_class& One_obj)
{
m_TBLName=One_obj.m_TBLName;
return *this;
}
One_class(const One_class& One_obj)
{
m_TBLName=One_obj.m_TBLName;
};
const CString& get_value(void)const
{
return m_TBLName;
}
One_class(const CString& TBName)
{
m_TBLName=TBName;
};
private:
CString m_TBLName;
};
class relation_class
{
public:
friend class _c_1_TO_N_relation;
friend struct finder_relation_One_class;
const std::shared_ptr<One_class>& getOne(void)const
{
return m_one;
}
private:
std::list<std::shared_ptr<N_class>> m_Ns;
std::shared_ptr<One_class> m_one;
};
typedef struct finder_relation_One_class
{
finder_relation_One_class(const std::shared_ptr<One_class>& One_obj)
{
m_TBLName=One_obj->m_TBLName;
}
bool operator()(std::shared_ptr<relation_class>p)
{
return (m_TBLName == p->m_one->m_TBLName);
}
CString m_TBLName;
}finder_One_class;
class _c_1_TO_N_relation
{
public:
int getRelationsSize(void)const
{
return m_relations.size();
}
const std::list<std::shared_ptr<relation_class>>& getRelation(void)const
{
return m_relations;
}
const std::shared_ptr<One_class>& getOne(const std::shared_ptr<N_class> N_obj) const;
const std::list<std::shared_ptr<N_class>>& getNs(const std::shared_ptr<One_class>& One_obj) const;
BOOL addRelation(const std::shared_ptr<One_class> One_obj, const std::shared_ptr<N_class> N_obj);
_c_1_TO_N_relation(void);
~_c_1_TO_N_relation(void);
private:
static const std::list<std::shared_ptr<N_class>> retNULLList;
static const std::shared_ptr<One_class> retNULL;
std::list<std::shared_ptr<relation_class>> m_relations;
};
#include "StdAfx.h"
#include "_c_1_TO_N_relation.h"
const std::list<std::shared_ptr<N_class>> _c_1_TO_N_relation::retNULLList=(std::list<std::shared_ptr<N_class>>)NULL;
const std::shared_ptr<One_class> _c_1_TO_N_relation::retNULL=NULL;
_c_1_TO_N_relation::_c_1_TO_N_relation(void)
{
}
_c_1_TO_N_relation::~_c_1_TO_N_relation(void)
{
}
BOOL _c_1_TO_N_relation::addRelation(const std::shared_ptr<One_class> One_obj,
const std::shared_ptr<N_class> N_obj)
{
try{
std::list<std::shared_ptr<relation_class>>::iterator iter=
std::find_if(m_relations.begin(),m_relations.end(),finder_relation_One_class(One_obj));
if(iter!=m_relations.end())
{
std::list<std::shared_ptr<N_class>>::iterator iter_N=
std::find_if((*iter)->m_Ns.begin(),(*iter)->m_Ns.end(),finder_N_class(N_obj));
if(iter_N!=(*iter)->m_Ns.end())
{
return FALSE;
}
else
{
(*iter)->m_Ns.push_back(N_obj);
return TRUE;
}
}
else
{
std::shared_ptr<relation_class> relation(new relation_class);
relation->m_one=One_obj;
relation->m_Ns.push_back(N_obj);
m_relations.push_back(relation);
return TRUE;
}
}catch(...)
{
return FALSE;
}
}
const std::shared_ptr<One_class>& _c_1_TO_N_relation::getOne(const std::shared_ptr<N_class> N_obj)const
{
for(std::list<std::shared_ptr<relation_class>>::const_iterator iter=m_relations.begin();
iter!=m_relations.end();++iter)
{
for(std::list<std::shared_ptr<N_class>>::iterator iter_N=(*iter)->m_Ns.begin();
iter_N!=(*iter)->m_Ns.end();++iter_N)
{
if((*iter_N)->get_value()==N_obj->get_value())
{
return (*iter)->m_one;
}
}
}
return retNULL;//这里需要改
}
const std::list<std::shared_ptr<N_class>>& _c_1_TO_N_relation::getNs(
const std::shared_ptr<One_class>& One_obj)const
{
for(std::list<std::shared_ptr<relation_class>>::const_iterator iter=m_relations.begin();
iter!=m_relations.end();++iter)
{
if((*iter)->m_one->get_value()==One_obj->get_value())
{
return (*iter)->m_Ns;
}
}
return retNULLList;
}