浏览代码

tars2cpp增加servantHandlder&&callback增加右值引用重载

wuxf 1 年之前
父节点
当前提交
17e87c69f0
共有 3 个文件被更改,包括 60 次插入54 次删除
  1. 0 7
      tools/tars2cpp/main.cpp
  2. 59 38
      tools/tars2cpp/tars2cpp.cpp
  3. 1 9
      tools/tars2cpp/tars2cpp.h

+ 0 - 7
tools/tars2cpp/main.cpp

@@ -33,7 +33,6 @@ void usage()
     cout << "  --tarsMaster                                create get registry info interface" << endl;
     cout << "  --currentPriority						   use current path first." << endl;
     cout << "  --without-trace                             不需要调用链追踪逻辑" << endl;
-    cout << "  --param-rvalue-ref                          参数使用右值引用(c++11后)" << endl;
     cout << "  tars2cpp support type: bool byte short int long float double vector map" << endl;
     exit(0);
 }
@@ -129,12 +128,6 @@ int main(int argc, char* argv[])
         t2c.setTrace(true);
     }
 
-    // 参数使用指针(需要业务自己释放)
-    if (option.hasParam("param-rvalue-ref"))
-    {
-        t2c.setParamRvalueRef(true);
-    }
-
     if (option.hasParam("xml"))
     {
         vector<string> vXmlIntf;

+ 59 - 38
tools/tars2cpp/tars2cpp.cpp

@@ -37,7 +37,6 @@ Tars2Cpp::Tars2Cpp()
 // , _unknownField(false)
 , _tarsMaster(false)
 , _bTrace(true)
-, _bPraramRvalueRef(false)
 {
 
 }
@@ -1436,26 +1435,26 @@ string Tars2Cpp::generateDispatchAsync(const OperationPtr& pPtr, const string& c
     string sParams;
     if (pPtr->getReturnPtr()->getTypePtr())
     {
-        if (!pPtr->getReturnPtr()->getTypePtr()->isSimple() && _bPraramRvalueRef)
+        if (pPtr->getReturnPtr()->getTypePtr()->isSimple())
         {
-            sParams = "std::move(" + pPtr->getReturnPtr()->getId() + "), ";
+            sParams = pPtr->getReturnPtr()->getId() + ", ";
         }
         else
         {
-            sParams = pPtr->getReturnPtr()->getId() + ", ";
+            sParams = "std::move(" + pPtr->getReturnPtr()->getId() + "), ";
         }
     }
     for (size_t i = 0; i < vParamDecl.size(); i++)
     {
         if (vParamDecl[i]->isOut())
         {
-            if (!vParamDecl[i]->getTypeIdPtr()->getTypePtr()->isSimple() && _bPraramRvalueRef)
+            if (vParamDecl[i]->getTypeIdPtr()->getTypePtr()->isSimple())
             {
-                sParams += "std::move(" + vParamDecl[i]->getTypeIdPtr()->getId() + "), ";
+                sParams += vParamDecl[i]->getTypeIdPtr()->getId() + ", ";
             }
             else
             {
-                sParams += vParamDecl[i]->getTypeIdPtr()->getId() + ", ";
+                sParams += "std::move(" + vParamDecl[i]->getTypeIdPtr()->getId() + "), ";
             }
         }
     }
@@ -1525,26 +1524,26 @@ string Tars2Cpp::generateDispatchCoroAsync(const OperationPtr& pPtr, const strin
     string sParams;
     if (pPtr->getReturnPtr()->getTypePtr())
     {
-        if (!pPtr->getReturnPtr()->getTypePtr()->isSimple() && _bPraramRvalueRef)
+        if (pPtr->getReturnPtr()->getTypePtr()->isSimple())
         {
-            sParams = "std::move(" + pPtr->getReturnPtr()->getId() + "), ";
+            sParams = pPtr->getReturnPtr()->getId() + ", ";
         }
         else
         {
-            sParams = pPtr->getReturnPtr()->getId() + ", ";
+            sParams = "std::move(" + pPtr->getReturnPtr()->getId() + "), ";
         }
     }
     for (size_t i = 0; i < vParamDecl.size(); i++)
     {
         if (vParamDecl[i]->isOut())
         {
-            if (!vParamDecl[i]->getTypeIdPtr()->getTypePtr()->isSimple() && _bPraramRvalueRef)
+            if (vParamDecl[i]->getTypeIdPtr()->getTypePtr()->isSimple())
             {
-                sParams += "std::move(" + vParamDecl[i]->getTypeIdPtr()->getId() + "), ";
+                sParams += vParamDecl[i]->getTypeIdPtr()->getId() + ", ";
             }
             else
             {
-                sParams += vParamDecl[i]->getTypeIdPtr()->getId() + ", ";
+                sParams += "std::move(" + vParamDecl[i]->getTypeIdPtr()->getId() + "), ";
             }
         }
     }
@@ -1591,25 +1590,23 @@ string Tars2Cpp::generateHAsync(const OperationPtr& pPtr) const
     vector<ParamDeclPtr>& vParamDecl = pPtr->getAllParamDeclPtr();
     s << TAB << "virtual void " << "callback_" << pPtr->getId() << "(";
 
-    string sParams;
+    bool needRvalueFunc = false;
+    string sParams, sParamsRvalue, sParamsCall;
     if (pPtr->getReturnPtr()->getTypePtr())
     {
         if (pPtr->getReturnPtr()->getTypePtr()->isSimple())
         {
             sParams = tostr(pPtr->getReturnPtr()->getTypePtr()) + " ret, ";
+            sParamsRvalue = tostr(pPtr->getReturnPtr()->getTypePtr()) + " ret, ";
         }
         else
         {
             //结构, map, vector, string
-            if (_bPraramRvalueRef)
-            {
-                sParams = tostr(pPtr->getReturnPtr()->getTypePtr()) + "&& ret, ";
-            }
-            else
-            {
-                sParams = "const " + tostr(pPtr->getReturnPtr()->getTypePtr()) + "& ret, ";
-            }
+            sParams = "const " + tostr(pPtr->getReturnPtr()->getTypePtr()) + "& ret, ";
+            needRvalueFunc = true;
+            sParamsRvalue = tostr(pPtr->getReturnPtr()->getTypePtr()) + "&& ret, ";
         }
+        sParamsCall = "ret, ";
     }
     for (size_t i = 0; i < vParamDecl.size(); i++)
     {
@@ -1620,20 +1617,18 @@ string Tars2Cpp::generateHAsync(const OperationPtr& pPtr) const
             if (pPtr->getTypeIdPtr()->getTypePtr()->isSimple())
             {
                 sParams += tostr(pPtr->getTypeIdPtr()->getTypePtr());
+                sParamsRvalue += tostr(pPtr->getTypeIdPtr()->getTypePtr());
             }
             else
             {
                 //结构, map, vector, string
-                if (_bPraramRvalueRef)
-                {
-                    sParams += " " + tostr(pPtr->getTypeIdPtr()->getTypePtr()) + "&&";
-                }
-                else
-                {
-                    sParams += " const " + tostr(pPtr->getTypeIdPtr()->getTypePtr()) + "&";
-                }
+                sParams += " const " + tostr(pPtr->getTypeIdPtr()->getTypePtr()) + "&";
+                sParamsRvalue += tostr(pPtr->getTypeIdPtr()->getTypePtr()) + "&& ";
+                needRvalueFunc = true;
             }
             sParams += " " + pPtr->getTypeIdPtr()->getId() + ", ";
+            sParamsRvalue += " " + pPtr->getTypeIdPtr()->getId() + ", ";
+            sParamsCall += pPtr->getTypeIdPtr()->getId() + ", ";
         }
     }
     s << tars::TC_Common::trimright(sParams, ", ", false) << ")" << endl;
@@ -1643,6 +1638,12 @@ string Tars2Cpp::generateHAsync(const OperationPtr& pPtr) const
     s << TAB << "{ throw std::runtime_error(\"callback_" << pPtr->getId() << "_exception() override incorrect.\"); }";
     s << endl;
 
+    if (needRvalueFunc) {
+        s << TAB << "virtual void " << "callback_" << pPtr->getId() << "(";
+        s << tars::TC_Common::trimright(sParamsRvalue, ", ", false) << ")" << endl;
+        s << TAB << "{ callback_" << pPtr->getId() << "(" << tars::TC_Common::trimright(sParamsCall, ", ", false) << "); }" << endl;
+    }
+
     return s.str();
 }
 
@@ -1851,13 +1852,20 @@ string Tars2Cpp::generateServantDispatch(const OperationPtr& pPtr, const string&
 
     for(size_t i = 0; i < vParamDecl.size(); i++)
     {
-        if (!vParamDecl[i]->isOut() && !vParamDecl[i]->getTypeIdPtr()->getTypePtr()->isSimple() && _bPraramRvalueRef)
+        if (vParamDecl[i]->isOut())
         {
-            s << "std::move(" << vParamDecl[i]->getTypeIdPtr()->getId() << ")";
+            s << vParamDecl[i]->getTypeIdPtr()->getId();
         }
         else
         {
-            s << vParamDecl[i]->getTypeIdPtr()->getId();
+            if (vParamDecl[i]->getTypeIdPtr()->getTypePtr()->isSimple())
+            {
+                s << vParamDecl[i]->getTypeIdPtr()->getId();
+            }
+            else
+            {
+                s << "std::move(" << vParamDecl[i]->getTypeIdPtr()->getId() << ")";
+            }
         }
         if(i != vParamDecl.size() - 1)
             s << ",";
@@ -2293,9 +2301,11 @@ string Tars2Cpp::generateHAsync(const OperationPtr& pPtr, const string& cn) cons
 }
 
 /////////////////////////////////////////////////////////////////////////////////////////////////
-string Tars2Cpp::generateH(const OperationPtr& pPtr, bool bVirtual, const string& interfaceId, bool bRvalueRef) const
+string Tars2Cpp::generateH(const OperationPtr& pPtr, bool bVirtual, const string& interfaceId) const
 {
-    ostringstream s;
+    ostringstream s, sRvalue;
+    string sParamsCall;
+    bool needRvalue = false;
     vector<ParamDeclPtr>& vParamDecl = pPtr->getAllParamDeclPtr();
 
     s << TAB;
@@ -2303,11 +2313,16 @@ string Tars2Cpp::generateH(const OperationPtr& pPtr, bool bVirtual, const string
     if (bVirtual) s << "virtual ";
 
     s << tostr(pPtr->getReturnPtr()->getTypePtr()) << " " << pPtr->getId() << "(";
+    sRvalue << tostr(pPtr->getReturnPtr()->getTypePtr()) << " " << pPtr->getId() << "(";
 
     string routekey = "";
     for (size_t i = 0; i < vParamDecl.size(); i++)
     {
-        s << generateH(vParamDecl[i], bRvalueRef) << ",";
+        s << generateH(vParamDecl[i], false) << ",";
+        sRvalue << generateH(vParamDecl[i], true) << ",";
+        sParamsCall += vParamDecl[i]->getTypeIdPtr()->getId() + ", ";
+
+        if (!vParamDecl[i]->getTypeIdPtr()->getTypePtr()->isSimple() && !vParamDecl[i]->isOut()) needRvalue = true;
 
         if (routekey.empty() && vParamDecl[i]->isRouteKey())
         {
@@ -2318,6 +2333,12 @@ string Tars2Cpp::generateH(const OperationPtr& pPtr, bool bVirtual, const string
     if (bVirtual)
     {
         s << "tars::TarsCurrentPtr _current_) = 0;";
+        if (needRvalue)
+        {
+            s << endl;
+            s << TAB << "virtual " << sRvalue.str() << "tars::TarsCurrentPtr _current_) " << endl << TAB << "{ return "
+              << pPtr->getId() << "(" << tars::TC_Common::trimright(sParamsCall, ", ", false) << ", _current_); }";
+        }
     }
     else
     {
@@ -3111,7 +3132,7 @@ string Tars2Cpp::generateH(const InterfacePtr &pPtr, const NamespacePtr &nPtr) c
 
     for (size_t i = 0; i < vOperation.size(); i++)
     {
-        s << generateH(vOperation[i], false, pPtr->getId(), false); // << endl;
+        s << generateH(vOperation[i], false, pPtr->getId()); // << endl;
         s << generateHAsync(vOperation[i], pPtr->getId()) << endl;
     }
 
@@ -3165,7 +3186,7 @@ string Tars2Cpp::generateH(const InterfacePtr &pPtr, const NamespacePtr &nPtr) c
 
     for (size_t i = 0; i < vOperation.size(); i++)
     {
-        s << generateH(vOperation[i], true, pPtr->getId(), _bPraramRvalueRef) << endl;
+        s << generateH(vOperation[i], true, pPtr->getId()) << endl;
     }
 
     DEL_TAB;

+ 1 - 9
tools/tars2cpp/tars2cpp.h

@@ -96,12 +96,6 @@ public:
     */
     void setTrace(bool bTrace) { _bTrace = bTrace; }
 
-    /**
-    * 参数使用右值引用
-    * @param bPoint
-    */
-    void setParamRvalueRef(bool bRvalue) { _bPraramRvalueRef = bRvalue; }
-
     //下面是编解码的源码生成
 protected:
     /**
@@ -433,7 +427,7 @@ protected:
      *
      * @return string
      */
-    string generateH(const OperationPtr &pPtr, bool bVirtual, const string& interfaceId, bool bRvalueRef) const;
+    string generateH(const OperationPtr &pPtr, bool bVirtual, const string& interfaceId) const;
 
     /**
      * 生成接口的头文件源码
@@ -527,8 +521,6 @@ private:
     bool _tarsMaster;
 
     bool _bTrace;
-
-    bool _bPraramRvalueRef;
 };
 
 #endif