/*
 **************************************************************
 *         C++ Mathematical Expression Toolkit Library        *
 *                                                            *
 * Simple Example 12                                          *
 * Author: Arash Partow (1999-2016)                           *
 * 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(2.2), T(1.1), T(5.5), 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;
}
