Commit graph

768 commits

Author SHA1 Message Date
Yuri Kunde Schlesner 45976da975 CMake cleanup
Several cleanups to the buildsystem:
 - Do better factoring of common libs between platforms.
 - Add support to building on Windows.
 - Remove Qt4 support.
 - Re-sort file lists and add missing headers.
2014-09-01 18:06:30 -03:00
Yuri Kunde Schlesner 478289140d Replace GLEW with a glLoadGen loader.
This should fix the GL loading errors that occur in some drivers due to
the use of deprecated functions by GLEW. Side benefits are more accurate
auto-completion (deprecated function and symbols don't exist) and faster
pointer loading (less entrypoints to load). In addition it removes an
external library depency, simplifying the build system a bit and
eliminating one set of binary libraries for Windows.
2014-09-01 17:41:56 -03:00
bunnei 76372feb19 Merge pull request #84 from bunnei/fix-hw-synchronization
Fix GPU/HW synchronization
2014-08-31 00:53:07 -04:00
bunnei 038a51aac1 Merge pull request #82 from yuriks/addr-types
Introduce VAddr and PAddr typedefs for ARM addresses.
2014-08-30 23:27:46 -04:00
bunnei aabfcfe6ad GPU: Improve frame synchronization, increases compatibility with both homebrew and retail applications. 2014-08-30 23:24:14 -04:00
bunnei eb36d3fc90 Core: Refactor core to use only one function for execution.
Core: Cleaned up comment to be more readable.

Citra: Changed loop to be more readable.
2014-08-30 23:23:38 -04:00
bunnei 738b88293c Loader: Added support for loading raw BIN executables.
- Useful for debugging homebrew

Qt: Updated GUI to support loading .bin files.
2014-08-30 23:23:33 -04:00
bunnei 3ade84cb7b Threading: Fix thread starting to execute first instruction correctly. 2014-08-30 23:23:32 -04:00
bunnei ae93adddd1 srv::Initialize: Return "success" status code. 2014-08-30 23:23:31 -04:00
Yuri Kunde Schlesner 83c3d2bcd1 Introduce VAddr and PAddr typedefs for ARM addresses. 2014-08-31 00:04:11 -03:00
bunnei 06864c93fd Merge pull request #80 from bunnei/fix-latest-libctru
Fixes Citra for the latest changes made to the "refactor" branch of libctru.
- For reference, see: https://github.com/smealum/ctrulib/tree/refactor/libctru
2014-08-28 18:07:45 -04:00
bunnei 6966fdf025 Loader: Added support for loading raw BIN executables.
- Useful for debugging homebrew

Qt: Updated GUI to support loading .bin files.
2014-08-28 17:51:49 -04:00
bunnei 304999dfeb Threading: Fix thread starting to execute first instruction correctly. 2014-08-28 17:51:49 -04:00
bunnei fb908b9395 srv::Initialize: Return "success" status code. 2014-08-28 17:51:41 -04:00
Yuri Kunde Schlesner 9d172ab550 Downgrade GLSL version to 1.50 (compatible with GL 3.2) 2014-08-28 05:38:13 -03:00
bunnei 20d169e4a1 VideoCore: Fixes rendering issues on Qt and corrects framebuffer output size. 2014-08-26 17:34:52 -04:00
Kevin Hartman cbfd6b6e52 Rewrite of OpenGL renderer, including OS X support
Screen contents are now displayed using textured quads. This can be updated to expose an FBO once an OpenGL backend for when Pica rendering is being worked on. That FBO's texture can then be applied to the quads.

Previously, FBO blitting was used in order to display screen contents, which did not work on OS X. The new textured quad approach is less of a compatibility risk.
2014-08-25 20:56:59 -07:00
Tony Wasserka a79644c9ba Pica/Rasterizer: Clarify a TODO. 2014-08-25 22:03:19 +02:00
Tony Wasserka 697b50c3ff Pica/VertexShader: Fix a bug in the call stack handling. 2014-08-25 22:03:19 +02:00
Tony Wasserka b5b3aeb576 Math: Warning fixes. 2014-08-25 22:03:19 +02:00
Tony Wasserka 941762a573 GPU: Fix a compiler warning about redundant semicolons. 2014-08-25 22:03:19 +02:00
Tony Wasserka 2f1c129f64 Pica: Consolidate the primitive assembly code in PrimitiveAssembly and GeometryDumper. 2014-08-25 22:03:19 +02:00
Tony Wasserka 9679d231df Pica/Rasterizer: Add texturing support. 2014-08-25 22:03:18 +02:00
Tony Wasserka 34fa0b6d9c Pica/DebugUtils: Add convenient tev setup printer. 2014-08-25 22:03:18 +02:00
Tony Wasserka 27cab6477e Pica/Rasterizer: Add initial implementation of texture combiners. 2014-08-25 22:03:18 +02:00
Tony Wasserka c4691b784b Pica: Add support for dumping textures. 2014-08-25 22:03:18 +02:00
Tony Wasserka 162d641a30 Pica/Math: Improved the design of the Vec2/Vec3/Vec4 classes and simplified rasterizer code accordingly.
- Swizzlers now return const objects so that things like "first_vec4.xyz() = some_vec3" now will fail to compile (ideally we should support some vector holding references to make this actually work).
- The methods "InsertBeforeX/Y/Z" and "Append" have been replaced by more versions of MakeVec, which now also supports building new vectors from vectors.
- Vector library now follows C++ type promotion rules (hence, the result of Vec2<u8> with another Vec2<u8> is now a Vec2<int>).
2014-08-25 22:03:18 +02:00
Tony Wasserka 62c36a4ef0 Pica/VertexShader: Fix a bug in the bitfield definitions and add the "negate" field for swizzlers. 2014-08-25 22:03:18 +02:00
Tony Wasserka 26ade98411 Pica/citra-qt: Replace command list view and command list debugging code with something more sophisticated. 2014-08-25 22:03:18 +02:00
Tony Wasserka 0465adf206 Pica/CommandProcessor: Implement parameter masking. 2014-08-25 22:03:18 +02:00
Tony Wasserka f37e39deb9 Pica: Add debug utilities for dumping shaders. 2014-08-25 22:03:18 +02:00
Tony Wasserka 6ea003c7b5 Pica: Add debug utility functions for dumping geometry data. 2014-08-25 22:03:18 +02:00
Tony Wasserka 14b24a75b3 GSP: Update framebuffer information when necessary. 2014-08-25 22:03:18 +02:00
Tony Wasserka 590c206ac8 GSP: Implement SetBufferSwap. 2014-08-25 22:03:18 +02:00
Tony Wasserka e832bbe554 GSP: Add a helper function for convenience. 2014-08-25 22:02:33 +02:00
Sacha 1b1205cf73 Pass format to the QGLWidget and use atomic instead of mutex. 2014-08-25 03:42:52 +10:00
Sacha b044510fa9 Fix EmuThread loop by ensuring it exits properly.
Note: There is a pre-existing issue with booting a new game in that it keeps the old EmuThread.
The GL code now supports this but the Core still doesn't.
2014-08-25 01:49:34 +10:00
Sacha a3a70e56ac Fix the threading for GL Context in Qt5.
Connect the emu_thread start/finish to a moveContext slot.
2014-08-25 00:47:00 +10:00
bunnei 0ffc966e42 Merge pull request #68 from archshift/readfile
Added FS functions to Archive and Archive_RomFS
2014-08-22 18:50:00 -04:00
archshift 4c4a01bf41 Added FS functions to Archive and Archive_RomFS 2014-08-22 15:45:10 -07:00
bunnei c3c66ad34d Merge pull request #46 from archshift/citrah
Removed unused citra.h
2014-08-21 18:27:54 -04:00
bunnei 59d512484a Merge pull request #58 from lioncash/clamp
Common: Add a clamp function to math_utils.h
2014-08-21 11:31:43 -04:00
Emmanuel Gil Peyrot ef27770a53 ARM: Remove a forgotten const in vfp. 2014-08-20 17:50:27 +00:00
archshift d93dc81953 Revert "Removed redundant loop in EmuThread::run()" 2014-08-20 10:15:12 -07:00
archshift 80c4d7bf48 Removed unused citra.h 2014-08-19 22:22:12 -07:00
bunnei bc64261d29 Merge pull request #60 from xsacha/qt5
Use Qt5 by default for citra-qt project.
2014-08-19 19:08:01 -04:00
bunnei 0db986d92a Merge pull request #61 from lioncash/kernel-stuff
Core: Use std::array for managing kernel object space
2014-08-19 19:01:22 -04:00
bunnei 39fbb0d508 Merge pull request #59 from lioncash/fwddecl
Common: Get rid of an unnecessary forward declaration in symbols.h
2014-08-19 19:00:22 -04:00
Sacha 90f23020f5 Add Qt5 option. Use Qt5 by default. 2014-08-19 21:34:00 +10:00
Lioncash 2f571a0d9d Common: Add a clamp function to math_utils.h 2014-08-19 03:37:38 -04:00
Lioncash ab4648d3ca Core: Use std::array for managing kernel object space
These avoid relying on memset for clearing the arrays.
2014-08-19 00:32:48 -04:00
bunnei e9c5c563a5 Merge pull request #55 from lioncash/string
Core: Alter the kernel string functions to use std::string instead of const char*.
2014-08-18 21:42:44 -04:00
bunnei 10f25866e2 SVC: Added support for svc_GetSystemTick.
Changed HLE function return methods to be static inline functions.
2014-08-18 21:26:20 -04:00
Lioncash 85a20a9b19 Common: Get rid of an unnecessary forward declaration in symbols.h 2014-08-18 16:40:17 -04:00
bunnei 0a1aab5b42 Merge pull request #57 from lioncash/str
Common: Don't return a reference to a string when calling GetName in symbols.cpp
2014-08-18 15:35:47 -04:00
Lioncash a49a5fa4d9 Common: Don't return a reference to a string when calling GetName in symbols.cpp
Returning a copy of the string is what was likely meant to be done.
2014-08-18 01:59:03 -04:00
Sacha b7ecc9543a CMake Cleanup 2014-08-18 14:35:44 +10:00
Lioncash 98fa3f7cba Core: Alter the kernel string functions to use std::string instead of const char*.
Most functions already operate on std::strings. This also removes the need to manually null terminate thread names.
2014-08-17 23:12:20 -04:00
bunnei 68c81f28d9 Merge pull request #52 from lioncash/memory
Common: Correctly set ptr to null if mmap fails in memory_util
2014-08-17 20:38:28 -04:00
bunnei 3cd5ede355 Merge pull request #49 from archshift/redundantloop
Removed redundant loop in EmuThread::run()
2014-08-17 20:35:18 -04:00
bunnei 54d5d4477f Merge pull request #48 from linkmauve/master
Replace insecure temporary file creation with devshm.
2014-08-17 20:33:47 -04:00
bunnei b26f25356d Merge pull request #51 from lioncash/pragma
Common: Move header guards over to pragma once.
2014-08-17 20:32:04 -04:00
bunnei 7ed73af78f Merge pull request #53 from lioncash/memmap
Core: Fix undefined behavior in mem_map_funcs' WriteBlock function
2014-08-17 20:30:30 -04:00
Lioncash 986dd27392 Core: Fix a formatting error in svc.cpp
entry_point would not be added to the string. Also used StringFromFormat
so that the buffer is unnecessary.
2014-08-17 14:28:39 -04:00
Lioncash da18671166 Core: Fix undefined behavior in mem_map_funcs' WriteBlock function 2014-08-17 14:23:54 -04:00
Lioncash cc9f352b66 Common: Correctly set ptr to null if mmap fails in memory_util
On POSIX systems mmap will return MAP_FAILED ((void*)-1) instead of a null pointer.
2014-08-17 14:08:43 -04:00
Lioncash da6f24b374 Common: Move remaining C header includes over to their C++ equivalent 2014-08-17 13:54:06 -04:00
Lioncash 90e994471a Common: Move header guards over to pragma once
Also replaced C headers with the C++ equivalent ones
2014-08-17 13:45:55 -04:00
archshift 9a4e58c370 Removed redundant loop in EmuThread::run() 2014-08-16 23:31:25 -07:00
Emmanuel Gil Peyrot c91d9fd837 mem_arena: Replace insecure temporary file creation with devshm, importing Dolphin’s code. 2014-08-16 10:12:30 +02:00
archshift 6096b289b7 Bootmanager: changed filename to std::string 2014-08-14 23:59:31 -07:00
bunnei 73c53b5eb8 Merge pull request #43 from archshift/iftree
Simplified if-tree in extended_trace.cpp
2014-08-13 13:16:03 -04:00
bunnei 388356f629 Merge pull request #42 from archshift/glexp
Use glewExperimental to fix crashes with citra-glfw
2014-08-13 13:10:45 -04:00
archshift 662a1993e6 float24: Remove private default constructor
Fixes building with clang.
2014-08-13 02:54:16 -07:00
bunnei bf7bc3dacd Merge pull request #39 from bunnei/hid-minor-improvements
Hid minor improvements
2014-08-12 18:23:17 -04:00
bunnei 091f6cf55b HID: Added new function entries from 3dbrew to FunctionTable.
HID: Fix typo with DisableGyroscopeLow command.
2014-08-12 18:08:09 -04:00
archshift a7c549a40c Simplified if-tree in extended_trace.cpp 2014-08-12 14:34:25 -07:00
archshift d71af1bd20 Use glewExperimental on Linux in order to fix GLFW-mode 2014-08-12 13:42:04 -07:00
bunnei 0ccd026a6d Merge pull request #41 from archshift/itr
Changed iterators to use auto, many of which using range-based loops
2014-08-12 10:12:39 -04:00
Tony Wasserka 94d742fe17 Pica: Add basic rasterizer. 2014-08-12 13:50:07 +02:00
Tony Wasserka 94aa9da562 Pica: Add triangle clipper. 2014-08-12 13:49:33 +02:00
Tony Wasserka 9a76a2d061 Pica: Add primitive assembly stage. 2014-08-12 13:48:56 +02:00
Tony Wasserka c526512619 Pica: Add vertex shader implementation. 2014-08-12 13:48:10 +02:00
Tony Wasserka d443f0a921 Pica: Implement vertex loading. 2014-08-12 13:47:31 +02:00
Tony Wasserka 1a43f69477 Pica: Add register definition for vertex loading and rendering. 2014-08-12 13:47:31 +02:00
Tony Wasserka 76a586de49 Pica: Add command processor. 2014-08-12 13:47:30 +02:00
Tony Wasserka 98ad16a45b Pica: Add float24 structure.
24-bit floating points are used internally for calculations on the GPU, however the current code will still emulate that with 32-bit floating points.
In the future we might want to accurately perform the calculations with correct bitness in the future, but for now we just wrap the calculations around this class.
2014-08-12 13:46:24 +02:00
Tony Wasserka 8528c810cf Video core: Add utility class for vector operations.
I wrote most of this for ppsspp, so I hold full copyright over it.
In addition to the original release in ppsspp, this provides functionality to easily extend e.g. two-dimensional vectors to three-dimensional vectors.
2014-08-12 13:46:20 +02:00
Tony Wasserka 7b6a7d7dfb Pica/GPU: Change hardware registers to use physical addresses rather than virtual ones.
This cleans up the mess that address reading/writing had become and makes the code a *lot* more sensible.
This adds a physical<->virtual address converter to mem_map.h. For further accuracy, we will want to properly extend this to support a wider range of address regions. For now, this makes simply homebrew applications work in a good manner though.
2014-08-12 13:32:56 +02:00
Tony Wasserka bd798390d5 GSP: Fix a major regression introduced in ffda035c, due to which no display transfers were triggered at all anymore. 2014-08-12 13:32:18 +02:00
archshift 1a2604902f break_points.cpp: return directly from conditionals 2014-08-12 04:04:54 -07:00
archshift e3efc613fd break_points: cleaned up, added find_ifs 2014-08-12 03:48:11 -07:00
archshift 5a7c3ad194 Changed iterators to use auto, some of which using range-based loops 2014-08-11 17:53:23 -07:00
Tony Wasserka 9c781a6c76 Remove the fancy RegisterSet class introduced in 4c2bff61e.
While it was some nice and fancy template usage, it ultimately had many practical issues regarding length of involved expressions under regular usage as well as common code completion tools not being able to handle the structures.
Instead, we now use a more conventional approach which is a lot more clean to use.
2014-08-12 02:17:21 +02:00
Anthony J. Bentley dad3655a6d Use pthread_set_name_np() on OpenBSD. 2014-08-07 22:56:58 -06:00
bunnei 552287498a HID: Implemented HID_User::GetIPCHandles service function. 2014-08-07 20:27:56 -04:00
bunnei 66f91b4346 SVC: Fixed typo with MapMemoryBlock DEBUG_LOG call. 2014-08-07 20:27:11 -04:00
bunnei 0805ecbaca GPU: Updated g_last_ticks variable to be more descriptive (represents CPU tick count of last vertical line). 2014-08-06 18:20:02 -04:00
bunnei 7ada2625fe GPU: Updated horizontal sync line counter to use framebuffer height. 2014-08-06 18:20:01 -04:00
bunnei d4bd2f2e5d Thread: Added more descriptive comment to WaitCurrentThread. 2014-08-06 18:19:59 -04:00
bunnei cad2f21985 GSP: Cleaned up command buffer decoding.
GSP: Cleaned up code and added additional comments.

GSP: Removed unnecessary TODO comment.

GSP: Changed u32 iterators in TriggerCmdReqQueue to unsigned.
2014-08-06 18:19:56 -04:00
bunnei 36fd1c169e GSP: Added reinitialization of other state objects. 2014-08-05 23:58:00 -04:00
bunnei 4e9f305ed2 GSP: Removed dumb GX prefixes to functions/structs in GSP namespace.
- Various other cleanups.
2014-08-05 23:58:00 -04:00
bunnei 99e404e221 GSP: Removed unnecessary GX_FinishCommand function. 2014-08-05 23:57:59 -04:00
bunnei ec14ffe1cd GSP: Implements preliminary command synchronization via GPU interrupts.
Core: Added a comment to explain the logic for the RunLoop iterations.
2014-08-05 23:57:53 -04:00
bunnei c48ab0bd9e MemMap: Fixed typo with GetPointer to VRAM address. 2014-08-05 23:54:28 -04:00
bunnei 2542350b85 AddressArbiter: Removed unnecessary HLE::Reschedule. 2014-08-05 23:54:28 -04:00
bunnei 60078baab1 AddressArbiter: Fixed bug with break statements missing from case statements. 2014-08-05 23:54:27 -04:00
bunnei 1b247b8031 SRV: Updated GetProcSemaphore to create an event instead of a mutex. 2014-08-05 23:54:27 -04:00
bunnei 4d4607041b SVC: Removed ArbitrateAddress log message that spams to much. 2014-08-05 23:53:58 -04:00
bunnei 7a1f813be1 Kernel: Updated Event and Mutex to specify handle that they are blocking for. 2014-08-05 20:14:51 -04:00
bunnei 2003ccf09d Qt: Removed unnecessary HW::Update. 2014-08-05 20:14:49 -04:00
bunnei 90aaab1df0 Merge pull request #36 from bunnei/fix-memory-unaligned-reads
Fix memory unaligned reads
2014-08-05 20:09:04 -04:00
bunnei 967e5629de MemMap: Added an error for unaligned 16-bit memory reads. 2014-08-05 20:05:06 -04:00
bunnei da81742439 MemMap: Removed Read64 function.
- Unused code
- Was not correct for unaligned memory reads
2014-08-05 20:01:55 -04:00
bunnei 81fa804b3c FS: Fix port name (old port name was based on an unaligned memory read). 2014-08-05 19:58:33 -04:00
bunnei 2b52ec4829 MemMap: Fix Read32 for unaligned memory reads.
MemMap: Cleaned up Read32 unaligned memory access.
2014-08-05 19:58:28 -04:00
bunnei 77fc029a00 ARM: Synchronize Citra's SkyEye core with 3dmoo's. 2014-07-23 19:16:40 -04:00
bunnei 866d2a62e9 Merge pull request #27 from neobrain/disassembly_view_rewrite
citra-qt: Rewrite disassembly view.
2014-07-23 10:43:46 -04:00
Tony Wasserka c131fb2c27 citra-qt: Show function names in disassembler based on bunnei's suggestion. 2014-07-23 00:58:52 +02:00
Tony Wasserka 456b9feb25 Disassembler: Chose slightly lower value for chunk size. 2014-07-23 00:50:28 +02:00
Tony Wasserka 9fd2537e93 Use uniform formatting when printing hexadecimal numbers. 2014-07-23 00:44:31 +02:00
Tony Wasserka afcb250b31 Fix a few warnings.
Templates shouldn't be marked as inline if they aren't defined in the header.
2014-07-23 00:44:31 +02:00
Tony Wasserka 2eb61dafc0 GPU: Clarify display transfer code.
Also makes the illogical component order more obvious.
2014-07-23 00:44:31 +02:00
Tony Wasserka 61e2ffd448 GPU: Add documentation. 2014-07-23 00:44:31 +02:00
Tony Wasserka 4b141791ed GSP: Add a few comments. 2014-07-23 00:44:31 +02:00
Tony Wasserka 9b0d0c81a0 GSP: Clean up GX command processing a lot and treat command id as a u8 rather than a u32.
Anonymous structs are not standard C++, hence don't use them.
2014-07-23 00:44:31 +02:00
Tony Wasserka 246cb75584 RegisterSet: Simplify code by using structs for register definition instead of unions. 2014-07-23 00:33:08 +02:00
Tony Wasserka 75775e9ef4 GPU: Make use of RegisterSet. 2014-07-23 00:33:08 +02:00
Tony Wasserka 357d893b26 GPU: Make framebuffer code format-aware. 2014-07-23 00:33:08 +02:00
Tony Wasserka c6fdeb7b23 Renderer: Fix component order in bottom framebuffer. 2014-07-23 00:33:08 +02:00
Tony Wasserka cb6f97b2eb Renderer: Respect the active_fb GPU register. 2014-07-23 00:33:08 +02:00
Tony Wasserka 9b96407e8e Renderer: Add a few TODOs. 2014-07-23 00:33:08 +02:00
Tony Wasserka 9d618d0b70 GPU: Interface cleanup. 2014-07-23 00:33:08 +02:00
Tony Wasserka 46950ee4de GPU: Initialize GPU registers to some sensible default state. 2014-07-23 00:33:08 +02:00
Tony Wasserka baf0aa04f5 GPU: Emulate memory fills. 2014-07-23 00:33:08 +02:00
Tony Wasserka 0b4055c152 GPU: Add proper framebuffer register handling. 2014-07-23 00:33:08 +02:00
Tony Wasserka bbc6f314eb GPU: Properly implement display transfers. 2014-07-23 00:33:08 +02:00
Tony Wasserka 16bbc4f81b GPU: Add display transfer configuration. 2014-07-23 00:33:08 +02:00
Tony Wasserka ec9511e1db GSP: HLE GXCommandId::SET_DISPLAY_TRANSFER and GXCommandId::SET_TEXTURE_COPY. 2014-07-23 00:33:08 +02:00
Tony Wasserka cb8f49b7ea GSP: Implement ReadHWRegs and WriteHWRegs properly. 2014-07-23 00:33:05 +02:00
Tony Wasserka 994d29f416 Use a more compatible choice of initial framebuffer addresses. 2014-07-22 22:27:27 +02:00
Tony Wasserka a4d89edd9b GPU debugger: Don't keep track of debugging data if no debugger views are active. 2014-07-22 22:27:27 +02:00
bunnei 97d47d55f3 Merge pull request #32 from yuriks/master
[build] Search for the git binary in the default msysgit install dir
2014-07-21 10:51:51 -04:00
Lioncash 8761461003 core: Kill off type redefenitions in armdefs.h 2014-07-19 22:02:21 -04:00
Yuri Kunde Schlesner 78eb8ba844 [build] Search for the git binary in the default msysgit install dir
The Git for Windows installer doesn't add the Git binaries to the path
by default. (Due to risk of conflicts with built-in windows commands.)
Unless you have configured your system specially this causes the
scm_rev_gen.js script to fail to find Git.  Added more paths to the
script so that it searches in the default msysgit installation
directory, eliminating the need to set the PATH for most environments.
2014-07-19 17:16:05 -03:00
Tony Wasserka 0da8e2eacc BitField: Cast enum values to proper integer type. 2014-07-16 12:47:33 +02:00
Tony Wasserka cd1d5786d9 BitField: Add a static_assert.
Being able to store BitField within unions requires BitField to be of standard layout, which in turn is only given if the underlying type is also has standard layout.
2014-07-16 12:46:37 +02:00
Tony Wasserka 15ab5382a5 BitField: Delete copy assignment to prevent obscure bugs.
Cf. https://github.com/dolphin-emu/dolphin/pull/483
2014-07-16 09:08:19 +02:00
Tony Wasserka 47a001722d BitField: Add an explicit evaluation method.
Sometimes it can be beneficial to use this in places where an explicit cast needs to happen otherwise. By using the evaluation method, it's not necessary anymore to explicitly write the underlying type in this case.
2014-07-16 09:05:29 +02:00