77
88#include " Tensor.h"
99
10+ #include < vector>
1011#include < map>
1112#include < set>
1213#include < array>
@@ -17,54 +18,67 @@ namespace RI
1718
1819namespace Global_Func
1920{
21+ template <typename T> const T ZERO{};
22+
2023 // tensor = find(m,i,j,k);
2124 // <=>
2225 // tensor = m.at(i).at(j).at(k);
2326 // Peize Lin add 2022.05.26
2427 template <typename Tkey, typename Tdata,
2528 typename std::enable_if<std::is_arithmetic<Tdata>::value,bool >::type=0 >
26- inline Tdata find (
29+ inline const Tdata & find (
2730 const std::map<Tkey, Tdata> &m,
2831 const Tkey &key)
2932 {
30- const auto ptr = m.find (key);
33+ const auto & ptr = m.find (key);
3134 if (ptr==m.end ())
32- return 0 ;
35+ return ZERO<Tdata> ;
3336 else
3437 return ptr->second ;
3538 }
3639 template <typename Tkey, typename Tdata>
37- inline Tensor<Tdata> find (
40+ inline const Tensor<Tdata> & find (
3841 const std::map<Tkey, Tensor<Tdata>> &m,
3942 const Tkey &key)
4043 {
41- const auto ptr = m.find (key);
44+ const auto & ptr = m.find (key);
4245 if (ptr==m.end ())
43- return Tensor<Tdata>{} ;
46+ return ZERO< Tensor<Tdata>> ;
4447 else
4548 return ptr->second ;
4649 }
4750 template <typename Tkey, typename Tdata, std::size_t Ndim>
48- inline std::array<Tdata,Ndim> find (
51+ inline const std::array<Tdata,Ndim> & find (
4952 const std::map<Tkey, std::array<Tdata,Ndim>> &m,
5053 const Tkey &key)
5154 {
52- const auto ptr = m.find (key);
55+ const auto &ptr = m.find (key);
56+ if (ptr==m.end ())
57+ return ZERO<std::array<Tdata,Ndim>>;
58+ else
59+ return ptr->second ;
60+ }
61+ template <typename Tkey, typename Tdata>
62+ inline const std::vector<Tdata> &find (
63+ const std::map<Tkey, std::vector<Tdata>> &m,
64+ const Tkey &key)
65+ {
66+ const auto &ptr = m.find (key);
5367 if (ptr==m.end ())
54- return std::array <Tdata,Ndim>{} ;
68+ return ZERO< std::vector <Tdata>> ;
5569 else
5670 return ptr->second ;
5771 }
58- template <typename Tkey , typename Tvalue, typename ... Tkeys>
59- inline auto find (
60- const std::map<Tkey, Tvalue> &m,
61- const Tkey &key ,
72+ template <typename Tkey0, typename Tkey1 , typename Tvalue, typename ... Tkeys>
73+ inline const auto & find (
74+ const std::map<Tkey0, std::map<Tkey1, Tvalue> > &m,
75+ const Tkey0 &key0 ,
6276 const Tkeys&... keys)
6377// -> decltype(find( m.find(key)->second, keys... )) // why error for C++ compiler high version
6478 {
65- const auto ptr = m.find (key );
79+ const auto & ptr = m.find (key0 );
6680 if (ptr==m.end ())
67- return decltype (find ( ptr->second , keys... )){} ;
81+ return ZERO< typename std::remove_reference< decltype (find ( ptr->second , keys... ))>::type> ;
6882 else
6983 return find ( ptr->second , keys... );
7084 }
0 commit comments