[Groonga-commit] groonga/grnxx at dcfb256 [master] Remove branches in loops. (#130)

Back to archive index

susumu.yata null+****@clear*****
Mon Dec 22 16:56:06 JST 2014


susumu.yata	2014-12-22 16:56:06 +0900 (Mon, 22 Dec 2014)

  New Revision: dcfb256a4ac22a20f983ce119a197e8dc443661d
  https://github.com/groonga/grnxx/commit/dcfb256a4ac22a20f983ce119a197e8dc443661d

  Message:
    Remove branches in loops. (#130)

  Modified files:
    lib/grnxx/impl/column/scalar/int.cpp

  Modified: lib/grnxx/impl/column/scalar/int.cpp (+128 -18)
===================================================================
--- lib/grnxx/impl/column/scalar/int.cpp    2014-12-22 16:12:54 +0900 (fe28d0f)
+++ lib/grnxx/impl/column/scalar/int.cpp    2014-12-22 16:56:06 +0900 (d8da1b0)
@@ -105,17 +105,73 @@ bool Column<Int>::contains(const Datum &datum) const {
   Int value = parse_datum(datum);
   size_t valid_size = get_valid_size();
   if (value.is_na()) {
-    for (size_t i = 0; i < valid_size; ++i) {
-      // TODO: Improve this loop.
-      if (_get(i).is_na() && table_->_test_row(i)) {
-        return true;
+    switch (value_size_) {
+      case 8: {
+        for (size_t i = 0; i < valid_size; ++i) {
+          if ((values_8_[i] == na_value_8()) && table_->_test_row(i)) {
+            return true;
+          }
+        }
+        break;
+      }
+      case 16: {
+        for (size_t i = 0; i < valid_size; ++i) {
+          if ((values_16_[i] == na_value_16()) && table_->_test_row(i)) {
+            return true;
+          }
+        }
+        break;
+      }
+      case 32: {
+        for (size_t i = 0; i < valid_size; ++i) {
+          if ((values_32_[i] == na_value_32()) && table_->_test_row(i)) {
+            return true;
+          }
+        }
+        break;
+      }
+      default: {
+        for (size_t i = 0; i < valid_size; ++i) {
+          if (values_64_[i].is_na() && table_->_test_row(i)) {
+            return true;
+          }
+        }
+        break;
       }
     }
   } else {
-    for (size_t i = 0; i < valid_size; ++i) {
-      // TODO: Improve this loop.
-      if (_get(i).match(value)) {
-        return true;
+    switch (value_size_) {
+      case 8: {
+        for (size_t i = 0; i < valid_size; ++i) {
+          if ((values_8_[i] == value.raw()) && table_->_test_row(i)) {
+            return true;
+          }
+        }
+        break;
+      }
+      case 16: {
+        for (size_t i = 0; i < valid_size; ++i) {
+          if ((values_16_[i] == value.raw()) && table_->_test_row(i)) {
+            return true;
+          }
+        }
+        break;
+      }
+      case 32: {
+        for (size_t i = 0; i < valid_size; ++i) {
+          if ((values_32_[i] == value.raw()) && table_->_test_row(i)) {
+            return true;
+          }
+        }
+        break;
+      }
+      default: {
+        for (size_t i = 0; i < valid_size; ++i) {
+          if (values_64_[i].match(value) && table_->_test_row(i)) {
+            return true;
+          }
+        }
+        break;
       }
     }
   }
@@ -130,19 +186,73 @@ Int Column<Int>::find_one(const Datum &datum) const {
   Int value = parse_datum(datum);
   size_t valid_size = get_valid_size();
   if (value.is_na()) {
-    for (size_t i = 0; i < valid_size; ++i) {
-      // TODO: Improve this loop.
-      Int stored_value = _get(i);
-      if (stored_value.is_na() && table_->_test_row(i)) {
-        return Int(i);
+    switch (value_size_) {
+      case 8: {
+        for (size_t i = 0; i < valid_size; ++i) {
+          if ((values_8_[i] == na_value_8()) && table_->_test_row(i)) {
+            return Int(i);
+          }
+        }
+        break;
+      }
+      case 16: {
+        for (size_t i = 0; i < valid_size; ++i) {
+          if ((values_16_[i] == na_value_16()) && table_->_test_row(i)) {
+            return Int(i);
+          }
+        }
+        break;
+      }
+      case 32: {
+        for (size_t i = 0; i < valid_size; ++i) {
+          if ((values_32_[i] == na_value_32()) && table_->_test_row(i)) {
+            return Int(i);
+          }
+        }
+        break;
+      }
+      default: {
+        for (size_t i = 0; i < valid_size; ++i) {
+          if (values_64_[i].is_na() && table_->_test_row(i)) {
+            return Int(i);
+          }
+        }
+        break;
       }
     }
   } else {
-    for (size_t i = 0; i < valid_size; ++i) {
-      // TODO: Improve this loop.
-      Int stored_value = _get(i);
-      if (stored_value.match(value)) {
-        return Int(i);
+    switch (value_size_) {
+      case 8: {
+        for (size_t i = 0; i < valid_size; ++i) {
+          if ((values_8_[i] == value.raw()) && table_->_test_row(i)) {
+            return Int(i);
+          }
+        }
+        break;
+      }
+      case 16: {
+        for (size_t i = 0; i < valid_size; ++i) {
+          if ((values_16_[i] == value.raw()) && table_->_test_row(i)) {
+            return Int(i);
+          }
+        }
+        break;
+      }
+      case 32: {
+        for (size_t i = 0; i < valid_size; ++i) {
+          if ((values_32_[i] == value.raw()) && table_->_test_row(i)) {
+            return Int(i);
+          }
+        }
+        break;
+      }
+      default: {
+        for (size_t i = 0; i < valid_size; ++i) {
+          if (values_64_[i].match(value) && table_->_test_row(i)) {
+            return Int(i);
+          }
+        }
+        break;
       }
     }
   }
-------------- next part --------------
HTML����������������������������...
다운로드 



More information about the Groonga-commit mailing list
Back to archive index