/*
 **************************************************************
 *         C++ Mathematical Expression Toolkit Library        *
 *                                                            *
 * Simple Example 12                                          *
 * Author:  Arash Partow (1999-2017)                          *
 * URL: http://www.partow.net/programming/exprtk/index.html   *
 *                                                            *
 * Copyright notice:                                          *
 * Free use of the Mathematical Expression Toolkit Library is *
 * permitted under the guidelines and in accordance with the  *
 * most current version of the Common Public License.         *
 * http://www.opensource.org/licenses/cpl1.0.php              *
 *                                                            *
 **************************************************************
*/


#include <cstdio>
#include <string>
#include "exprtk.hpp"


template <typename T>
void bubble_sort()
{
   typedef exprtk::symbol_table<T> symbol_table_t;
   typedef exprtk::expression<T>     expression_t;
   typedef exprtk::parser<T>             parser_t;

   std::string bubblesort_program =
                  " var upper_bound := v[];                           "
                  " var swapped := false;                             "
                  " repeat                                            "
                  "   swapped := false;                               "
                  "   for (var i := 0; i < upper_bound; i += 1)       "
                  "   {                                               "
                  "     for (var j := i + 1; j < upper_bound; j += 1) "
                  "     {                                             "
                  "       if (v[i] > v[j])                            "
                  "       {                                           "
                  "         v[i] <=> v[j];                            "
                  "         swapped := true;                          "
                  "       };                                          "
                  "     };                                            "
                  "   };                                              "
                  "   upper_bound -= 1;                               "
                  " until (not(swapped) or (upper_bound == 0));       ";

   T v[] = { T(9.9), T(2.2), T(1.1), T(5.5), T(7.7), T(4.4), T(3.3) };

   symbol_table_t symbol_table;
   symbol_table.add_vector("v",v);

   expression_t expression;
   expression.register_symbol_table(symbol_table);

   parser_t parser;
   parser.compile(bubblesort_program,expression);

   expression.value();
}

int main()
{
   bubble_sort<double>();
   return 0;
}
