public void MissingCallbacks() { NativeOperatorCallbacks callbacks = new NativeOperatorCallbacks("math_msvc14.dll"); Assert.IsFalse(callbacks.MissingCallbacks.Contains("constant_e")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("constant_pi")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_add")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_subtract")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_multiply")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_divide")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_pow")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_remainder")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_abs")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_sqrt")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_exp")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_ln")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_log")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_sin")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_cos")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_tan")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_asin")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_acos")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_atan")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_sinh")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_cosh")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_tanh")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_round")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_floor")); Assert.IsFalse(callbacks.MissingCallbacks.Contains("operator_ceil")); }
public void Sqrt() { double x = 1; NativeOperatorCallbacks callbacks = new NativeOperatorCallbacks("math_msvc14.dll"); double result = callbacks.Sqrt(x); Assert.AreEqual(Math.Sqrt(x), result); }
public void Ceil() { double x = 1.5; NativeOperatorCallbacks callbacks = new NativeOperatorCallbacks("math_msvc14.dll"); double result = callbacks.Ceil(x); Assert.AreEqual(Math.Ceiling(x), result); }
public void Remainder() { double x = 1; double y = 2; NativeOperatorCallbacks callbacks = new NativeOperatorCallbacks("math_msvc14.dll"); double result = callbacks.Remainder(x, y); Assert.AreEqual(x % y, result); }
public void Pow() { double x = 1; double y = 2; NativeOperatorCallbacks callbacks = new NativeOperatorCallbacks("math_msvc14.dll"); double result = callbacks.Pow(x, y); Assert.AreEqual(Math.Pow(x, y), result); }
public void Divide() { double x = 1; double y = 2; NativeOperatorCallbacks callbacks = new NativeOperatorCallbacks("math_msvc14.dll"); double result = callbacks.Divide(x, y); Assert.AreEqual(x / y, result); }
public void Multiply() { double x = 1; double y = 2; NativeOperatorCallbacks callbacks = new NativeOperatorCallbacks("math_msvc14.dll"); double result = callbacks.Multiply(x, y); Assert.AreEqual(x * y, result); }
public void Subtract() { double x = 1; double y = 2; NativeOperatorCallbacks callbacks = new NativeOperatorCallbacks("math_msvc14.dll"); double result = callbacks.Subtract(x, y); Assert.AreEqual(x - y, result); }
/// <summary> /// Converts list of missing callbacks to readable string /// </summary> /// <param name="callbacks">Operator Callbacks</param> /// <returns>String of missing callbacks</returns> private string ConvertMissingCallbacksToString(OperatorCallbacks callbacks) { string[] missingCallbacks; NativeOperatorCallbacks noc = callbacks as NativeOperatorCallbacks; if (noc != null) { missingCallbacks = noc.MissingCallbacks; } else { NativeOperatorRemotingCallbacks norc = callbacks as NativeOperatorRemotingCallbacks; if (norc != null) { missingCallbacks = norc.MissingCallbacks; } else { return(null); } } StringBuilder text = new StringBuilder(); for (int i = 0; i < missingCallbacks.Length; i++) { if (i > 0) { text.Append(", "); } string current = missingCallbacks[i]; if (current.StartsWith("constant_", StringComparison.Ordinal)) { text.Append(current, 9, current.Length - 9); } else if (current.StartsWith("operator_", StringComparison.Ordinal)) { text.Append(current, 9, current.Length - 9); } else { text.Append(current); } } return(text.ToString()); }
public void ImplementationName() { NativeOperatorCallbacks callbacks = new NativeOperatorCallbacks("math_msvc14.dll"); Assert.AreEqual("MSVC v19.0 [SSE2]", callbacks.ImplementationName); }
private void OnImplementationAddButtonClick(object sender, EventArgs e) { ListView.Item selected = listView.FocusedItem; if (selected == null) { return; } using (OpenFileDialog dialog = new OpenFileDialog()) { dialog.CheckFileExists = true; dialog.Filter = Tx.T("mathlib.filetype") + " (*.dll)|*.dll"; dialog.FilterIndex = 0; dialog.RestoreDirectory = true; dialog.Title = Tx.T("mathlib.load"); if (dialog.ShowDialog(this) != DialogResult.OK) { return; } string filename = dialog.FileName; try { NativeOperatorCallbacks callbacks = new NativeOperatorCallbacks(filename); ToolStripMenuItem item = new ToolStripMenuItem(callbacks.ImplementationName); item.ShortcutKeyDisplayString = "(" + Path.GetFileName(filename) + ")"; item.Click += OnSetItemCallbacksButtonClick; item.Tag = callbacks; string missingCallbacks = ConvertMissingCallbacksToString(callbacks); if (!string.IsNullOrEmpty(missingCallbacks)) { item.ToolTipText = Tx.T("mathlib.missing callbacks") + missingCallbacks; } implementationButton.DropDownItems.Add(item); OnSetItemCallbacksButtonClick(item, EventArgs.Empty); } catch (BadImageFormatException) { if (Environment.Is64BitProcess) { try { NativeOperatorRemotingCallbacks callbacks = new NativeOperatorRemotingCallbacks(filename); ToolStripMenuItem item = new ToolStripMenuItem(callbacks.ImplementationName); item.ShortcutKeyDisplayString = "(x86, " + Path.GetFileName(filename) + ")"; item.Click += OnSetItemCallbacksButtonClick; item.Tag = callbacks; string missingCallbacks = ConvertMissingCallbacksToString(callbacks); if (!string.IsNullOrEmpty(missingCallbacks)) { item.ToolTipText = Tx.T("mathlib.missing callbacks") + missingCallbacks; } implementationButton.DropDownItems.Add(item); OnSetItemCallbacksButtonClick(item, EventArgs.Empty); } catch (InvalidOperationException) { MessageBox.Show(this, Tx.T("mathlib.errors.not valid"), Tx.T("mathlib.errors.title"), MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (Exception ex) { MessageBox.Show(this, ex.Message, Tx.T("mathlib.errors.title"), MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { MessageBox.Show(this, Tx.T("mathlib.errors.platform mismatch"), Tx.T("mathlib.errors.title"), MessageBoxButtons.OK, MessageBoxIcon.Error); } } catch (InvalidOperationException) { MessageBox.Show(this, Tx.T("mathlib.errors.not valid"), Tx.T("mathlib.errors.title"), MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (Exception ex) { MessageBox.Show(this, ex.Message, Tx.T("mathlib.errors.title"), MessageBoxButtons.OK, MessageBoxIcon.Error); } } }
/// <summary> /// Checks missing callbacks for given arithmetic expression /// </summary> /// <param name="item">Item to check</param> /// <param name="text">String builder to append warings to</param> private void CheckCallbacks(ListView.Item item, StringBuilder text) { if (item?.OperatorCallbacks == null) { return; } ArithmeticExpression ae = item.NumericValueSource as ArithmeticExpression; if (ae == null) { return; } bool isFirst = true; bool iconAppended = false; string[] missingCallbacks = null; NativeOperatorCallbacks callbacks = item.OperatorCallbacks as NativeOperatorCallbacks; if (callbacks != null) { missingCallbacks = callbacks.MissingCallbacks; if (missingCallbacks.Length == 0) { return; } } else { NativeOperatorRemotingCallbacks proxyCallbacks = item.OperatorCallbacks as NativeOperatorRemotingCallbacks; if (proxyCallbacks != null) { iconAppended = true; text.Append(" \f[-]\f[image:warning] \f[0xaa6400]\f[I]" + Tx.T("mathlib.remoting")); missingCallbacks = proxyCallbacks.MissingCallbacks; if (missingCallbacks.Length == 0) { text.Append("\f[I]\f[Rc]"); return; } } } if (missingCallbacks == null) { return; } for (int i = 0; i < missingCallbacks.Length; i++) { string current = missingCallbacks[i]; if (!ae.IsCallbackUsed(current)) { continue; } if (isFirst) { isFirst = false; if (iconAppended) { text.Append(" \f[0x999999]|\f[0xaa6400] " + Tx.T("mathlib.missing callbacks")); } else { text.Append(" \f[-]\f[image:warning] \f[0xaa6400]\f[I]" + Tx.T("mathlib.missing callbacks")); } } else { text.Append(", "); } if (current.StartsWith("constant_", StringComparison.Ordinal)) { text.Append("\f[I]"); text.Append(current, 9, current.Length - 9); text.Append("\f[I]"); } else if (current.StartsWith("operator_", StringComparison.Ordinal)) { text.Append(current, 9, current.Length - 9); } else { text.Append(current); } } if (!isFirst) { text.Append("\f[I]\f[Rc]"); } }
/// <summary> /// Loads all mathematical libraries from x86 and x64 folders /// </summary> /// <param name="items"></param> private void LoadAllExternalOperators(ToolStripItemCollection items) { string pathRoot = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); string pathBitness = Path.Combine(pathRoot, Environment.Is64BitProcess ? "x64" : "x86"); if (Directory.Exists(pathBitness)) { foreach (string filename in Directory.EnumerateFiles(pathBitness, "*.dll")) { try { NativeOperatorCallbacks callbacks = new NativeOperatorCallbacks(filename); ToolStripMenuItem item = new ToolStripMenuItem(callbacks.ImplementationName); item.Click += OnSetItemCallbacksButtonClick; item.Tag = callbacks; string missingCallbacks = ConvertMissingCallbacksToString(callbacks); if (!string.IsNullOrEmpty(missingCallbacks)) { item.ToolTipText = Tx.T("mathlib.missing callbacks") + missingCallbacks; } items.Add(item); } catch (Exception ex) { Debug.WriteLine("Can't load operator callbacks from \"" + Path.GetFileName(filename) + "\": " + ex.Message); } } } if (Environment.Is64BitProcess) { pathBitness = Path.Combine(pathRoot, "x86"); if (Directory.Exists(pathBitness)) { items.Add(new ToolStripSeparator()); foreach (string filename in Directory.EnumerateFiles(pathBitness, "*.dll")) { try { NativeOperatorRemotingCallbacks callbacks = new NativeOperatorRemotingCallbacks(filename); ToolStripMenuItem item = new ToolStripMenuItem(callbacks.ImplementationName); item.ShortcutKeyDisplayString = "(x86)"; item.Click += OnSetItemCallbacksButtonClick; item.Tag = callbacks; string missingCallbacks = ConvertMissingCallbacksToString(callbacks); if (!string.IsNullOrEmpty(missingCallbacks)) { item.ToolTipText = Tx.T("mathlib.missing callbacks") + missingCallbacks; } items.Add(item); } catch (Exception ex) { Debug.WriteLine("Can't load operator callbacks from \"" + Path.GetFileName(filename) + "\": " + ex.Message); } } } } }