aboutsummaryrefslogtreecommitdiff
path: root/src/support/xerces_string_guard.h
diff options
context:
space:
mode:
authorAdrian Kummerländer2014-05-03 22:04:16 +0200
committerAdrian Kummerländer2014-05-03 22:04:16 +0200
commit261170cc5b6661106877dc2611dab281f4d91348 (patch)
tree8482f249c090af5ca462f7e36a4b87082185f027 /src/support/xerces_string_guard.h
parente5ed418907f09bf8905463f42a44593d51159bc9 (diff)
downloadInputXSLT-261170cc5b6661106877dc2611dab281f4d91348.tar
InputXSLT-261170cc5b6661106877dc2611dab281f4d91348.tar.gz
InputXSLT-261170cc5b6661106877dc2611dab281f4d91348.tar.bz2
InputXSLT-261170cc5b6661106877dc2611dab281f4d91348.tar.lz
InputXSLT-261170cc5b6661106877dc2611dab281f4d91348.tar.xz
InputXSLT-261170cc5b6661106877dc2611dab281f4d91348.tar.zst
InputXSLT-261170cc5b6661106877dc2611dab281f4d91348.zip
Revamped DomDocumentCache with regard to thread safety
* DomDocumentCache::item class now is _finalized_ by default and doesn't perform document instantiation, just lifetime management ** xercesc::DOMDocument is instantiated inside the external function implementations and committed to the document cache for conversion to a xalan document * added mutex with scoped lock to prevent concurrent write access to the std::unordered_map contained withing DomDocumentCache * functionality of the _get_ member method was split into _get_ and _create_ ** added typedef for std::pair specialization type "optional_item" that functions as the return value of _create_ and _get_ * "locator->getSystemId()" was leaking memory as xerces doesn't manage the lifetime of the returned heap-allocated char array ** analog to XMLCh* strings ** transformed XercesStringGuard into template class to be instantiated on either XMLCh or char
Diffstat (limited to 'src/support/xerces_string_guard.h')
-rw-r--r--src/support/xerces_string_guard.h28
1 files changed, 23 insertions, 5 deletions
diff --git a/src/support/xerces_string_guard.h b/src/support/xerces_string_guard.h
index f64a53e..7b9517a 100644
--- a/src/support/xerces_string_guard.h
+++ b/src/support/xerces_string_guard.h
@@ -7,15 +7,33 @@
namespace InputXSLT {
+template <typename Type>
class XercesStringGuard {
public:
- XercesStringGuard(const std::string&);
- ~XercesStringGuard();
-
- XMLCh* operator*();
+ XercesStringGuard(const Type* src):
+ string_(src) { }
+
+ XercesStringGuard(
+ const std::basic_string<
+ typename std::remove_pointer<decltype(
+ xercesc::XMLString::transcode(new Type[1])
+ )>::type
+ >& src
+ ):
+ string_(xercesc::XMLString::transcode(src.data())) { }
+
+ ~XercesStringGuard() {
+ xercesc::XMLString::release(
+ const_cast<Type**>(&this->string_)
+ );
+ }
+
+ inline const Type* operator*() const {
+ return this->string_;
+ }
private:
- XMLCh* const string_;
+ const Type* const string_;
};