10#include "Teuchos_StandardParameterEntryValidators.hpp"
14std::string Teuchos::getVerbosityLevelParameterValueName(
15 const EVerbosityLevel verbLevel
33 true, std::invalid_argument,
"Teuchos::getVerbosityLevelParameterValue"
34 "Name(const Teuchos::EVerbosityLevel): Input argument " << verbLevel <<
35 " has an invalid value. Valid values are VERB_DEFAULT=" << VERB_DEFAULT
36 <<
", VERB_NONE=" << VERB_NONE <<
", VERB_LOW=" << VERB_LOW <<
", "
37 "VERB_MEDIUM=" << VERB_MEDIUM <<
", VERB_HIGH=" << VERB_HIGH <<
", AND "
38 "VERB_EXTREME=" << VERB_EXTREME <<
".");
56Teuchos::verbosityLevelParameterEntryValidator(
57 std::string
const& defaultParameterName
61 new StringToIntegralParameterEntryValidator<EVerbosityLevel>(
63 getVerbosityLevelParameterValueName(VERB_DEFAULT),
64 getVerbosityLevelParameterValueName(VERB_NONE),
65 getVerbosityLevelParameterValueName(VERB_LOW),
66 getVerbosityLevelParameterValueName(VERB_MEDIUM),
67 getVerbosityLevelParameterValueName(VERB_HIGH),
68 getVerbosityLevelParameterValueName(VERB_EXTREME)
71 "Use level set in code",
73 "Produce minimal output",
74 "Produce a little more output",
75 "Produce a higher level of output",
76 "Produce the highest level of output"
78 tuple<EVerbosityLevel>(
103BoolParameterEntryValidator::BoolParameterEntryValidator()
105 finishInitialization();
114 const std::string &sublistName,
const bool activeQuery
117 const any &anyValue = entry.
getAny(activeQuery);
118 if( anyValue.
type() ==
typeid(
bool) )
120 if( anyValue.
type() ==
typeid(std::string) ) {
124 if( str ==
"false" ) {
127 else if( str ==
"true" ) {
132 throwTypeError(entry,paramName,sublistName);
138 const int defaultValue
142 if(entry)
return getBool(*entry,paramName,paramList.
name(),
true);
143 return paramList.
get(paramName,defaultValue);
150 return "boolValidator";
154 std::string
const & docString,
159 out <<
"# Accepted types: " << acceptedTypesString_ <<
".\n";
172 std::string
const& paramName,
173 std::string
const& sublistName
177 getBool(entry, paramName, sublistName,
false);
182 std::string
const& paramName,
183 std::string
const& sublistName,
195void BoolParameterEntryValidator::finishInitialization()
197 std::ostringstream oss;
199 acceptedTypesString_ = oss.str();
201 acceptedTypesString_ = oss.str();
205void BoolParameterEntryValidator::throwTypeError(
206 ParameterEntry
const& entry,
207 std::string
const& paramName,
208 std::string
const& sublistName
211 const std::string &entryName = entry.getAny(
false).typeName();
213 true, Exceptions::InvalidParameterType
214 ,
"Error, the parameter {paramName=\""<<paramName<<
"\""
215 ",type=\""<<entryName<<
"\"}"
216 <<
"\nin the sublist \"" << sublistName <<
"\""
217 <<
"\nhas the wrong type."
218 <<
"\n\nThe accepted types are: " << acceptedTypesString_ <<
"!";
231 : preferredType_(PREFER_DOUBLE), acceptedTypes_(
AcceptedTypes())
233 finishInitialization();
240 : preferredType_(preferredType), acceptedTypes_(acceptedTypes)
242 finishInitialization();
251 const std::string &sublistName,
const bool activeQuery
254 const any &anyValue = entry.
getAny(activeQuery);
255 if( acceptedTypes_.allowInt() && anyValue.
type() ==
typeid(
int) )
257 if( acceptedTypes_.allowLongLong() && anyValue.
type() ==
typeid(
long long) )
259 if( acceptedTypes_.allowDouble() && anyValue.
type() ==
typeid(
double) )
261 if( acceptedTypes_.allowString() && anyValue.
type() ==
typeid(std::string) )
263 throwTypeError(entry,paramName,sublistName);
269 const std::string &sublistName,
const bool activeQuery
272 const any &anyValue = entry.
getAny(activeQuery);
273 if( acceptedTypes_.allowInt() && anyValue.
type() ==
typeid(
int) )
275 if( acceptedTypes_.allowLongLong() && anyValue.
type() ==
typeid(
long long) )
277 if( acceptedTypes_.allowDouble() && anyValue.
type() ==
typeid(
double) )
279 if( acceptedTypes_.allowString() && anyValue.
type() ==
typeid(std::string) )
281 throwTypeError(entry,paramName,sublistName);
287 const std::string &sublistName,
const bool activeQuery
290 const any &anyValue = entry.
getAny(activeQuery);
291 if( acceptedTypes_.allowInt() && anyValue.
type() ==
typeid(
int) )
293 if( acceptedTypes_.allowLongLong() && anyValue.
type() ==
typeid(
long long) )
295 if( acceptedTypes_.allowDouble() && anyValue.
type() ==
typeid(
double) )
297 if( acceptedTypes_.allowString() && anyValue.
type() ==
typeid(std::string) )
299 throwTypeError(entry,paramName,sublistName);
306 const std::string &sublistName,
const bool activeQuery
309 const any &anyValue = entry.
getAny(activeQuery);
310 if( acceptedTypes_.allowInt() && anyValue.
type() ==
typeid(
int) )
312 if( acceptedTypes_.allowLongLong() && anyValue.
type() ==
typeid(
long long) )
314 if( acceptedTypes_.allowDouble() && anyValue.
type() ==
typeid(
double) )
316 if( acceptedTypes_.allowString() && anyValue.
type() ==
typeid(std::string) )
318 throwTypeError(entry,paramName,sublistName);
325 const int defaultValue
329 if(entry)
return getInt(*entry,paramName,paramList.
name(),
true);
330 return paramList.
get(paramName,defaultValue);
335 const long long defaultValue
340 return paramList.
get(paramName,defaultValue);
345 const double defaultValue
349 if(entry)
return getDouble(*entry,paramName,paramList.
name(),
true);
350 return paramList.
get(paramName,defaultValue);
356 const std::string &defaultValue
360 if(entry)
return getString(*entry,paramName,paramList.
name(),
true);
361 return paramList.
get(paramName,defaultValue);
366 return acceptedTypes_.allowInt();
371 return acceptedTypes_.allowLongLong();
376 return acceptedTypes_.allowDouble();
381 return acceptedTypes_.allowString();
388 return preferredType_;
397 return "anynumberValidator";
402 std::string
const & docString,
407 out <<
"# Accepted types: " << acceptedTypesString_ <<
".\n";
420 std::string
const& paramName,
421 std::string
const& sublistName
429 getDouble(entry, paramName, sublistName,
false);
434 std::string
const& paramName,
435 std::string
const& sublistName,
440 switch(preferredType_) {
443 getInt(*entry,paramName,sublistName,
false),
447 case PREFER_LONG_LONG:
455 getDouble(*entry,paramName,sublistName,
false),
461 getString(*entry,paramName,sublistName,
false),
474void AnyNumberParameterEntryValidator::finishInitialization()
477 std::ostringstream oss;
478 bool addedType =
false;
484 oss <<
"\"long long\"";
487 if(acceptedTypes_.allowDouble()) {
488 if(addedType) oss <<
", ";
492 if(acceptedTypes_.allowString()) {
493 if(addedType) oss <<
", ";
497 acceptedTypesString_ = oss.str();
501void AnyNumberParameterEntryValidator::throwTypeError(
503 std::string
const& paramName,
504 std::string
const& sublistName
507 const std::string &entryName = entry.getAny(
false).typeName();
509 true, Exceptions::InvalidParameterType
510 ,
"Error, the parameter {paramName=\""<<paramName<<
"\""
511 ",type=\""<<entryName<<
"\"}"
512 <<
"\nin the sublist \"" << sublistName <<
"\""
513 <<
"\nhas the wrong type."
514 <<
"\n\nThe accepted types are: " << acceptedTypesString_ <<
"!";
523 AnyNumberParameterEntryValidator::PREFER_INT,
536 return mustAlreadyExist_;
546 this->mustAlreadyExist_ = shouldFileExist;
547 return mustAlreadyExist_;
552 this->EmptyNameOK_ = isEmptyNameOK;
564 std::string
const &sublistName)
const
570 "The \"" << paramName <<
"\"" <<
571 " parameter in the \"" << sublistName <<
572 "\" sublist is has an error." << std::endl << std::endl <<
573 "Error: The value that you entered was the wrong type." << std::endl <<
574 "Parameter: " << paramName << std::endl <<
575 "Type specified: " << entryName << std::endl <<
576 "Type accepted: " <<
typeid(std::string).name() <<
577 std::endl << std::endl);
578 if(mustAlreadyExist_ && !EmptyNameOK_){
582 "The \"" << paramName <<
"\"" <<
583 " parameter in the \"" << sublistName <<
584 "\" sublist is has an error." << std::endl << std::endl <<
585 "Error: The file must already exists. The value you entered does " <<
586 "not corresspond to an existing file name." << std::endl <<
587 "Parameter: " << paramName << std::endl <<
588 "File name specified: " << fileName << std::endl << std::endl);
595 return "FilenameValidator";
600 std::string
const &docString, std::ostream &out)
const
603 out <<
"# Validator Used: " << std::endl;
604 out <<
"# FileName Validator" << std::endl;
620 caseSensitive_(caseSensitive)
622 if (!caseSensitive_) {
625 for (
auto it = validStrings.
begin(); it != validStrings.
end(); ++it) {
626 upperCaseValidStrings[k] = upperCase(*it);
640 return validStrings_;
647 return validStrings_;
653 std::string
const &sublistName)
const
659 "The \"" << paramName <<
"\"" <<
660 " parameter in the \"" << sublistName <<
661 "\" sublist is has an error." << std::endl << std::endl <<
662 "Error: The value that you entered was the wrong type." <<
663 "Parameter: " << paramName << std::endl <<
664 "Type specified: " << entryName << std::endl <<
667 if(!validStrings_.is_null()){
670 value = upperCase(value);
672 it = std::find(validStrings_->begin(),
673 validStrings_->end(), value);
676 "The \"" << paramName <<
"\"" <<
677 " parameter in the \"" << sublistName <<
678 "\" sublist is has an error." << std::endl << std::endl <<
679 "Error: The value that was entered doesn't fall with in "
680 "the range set by the validator." <<
681 "Parameter: " << paramName << std::endl <<
682 "Acceptable Values: " << *validStrings_ << std::endl <<
691 return "StringValidator";
696 std::ostream &out)
const
699 out <<
"# Validator Used: " << std::endl;
700 out <<
"# String Validator" << std::endl;
701 if (validStrings_.get() && validStrings_->size()){
702 out <<
"# Acceptable Values: " << *validStrings_ << std::endl;
720 return rcp(
new BoolParameterEntryValidator());
726 return rcp(
new AnyNumberParameterEntryValidator());
732 AnyNumberParameterEntryValidator::EPreferredType
const preferredType,
733 AnyNumberParameterEntryValidator::AcceptedTypes
const& acceptedTypes
737 new AnyNumberParameterEntryValidator(
738 preferredType, acceptedTypes
744 std::string
const& paramName,
745 int const value, std::string
const& docString,
746 ParameterList *paramList,
747 AnyNumberParameterEntryValidator::AcceptedTypes
const& acceptedTypes
751 const RCP<const ParameterEntryValidator> paramEntryValidator =
753 AnyNumberParameterEntryValidator::PREFER_INT, acceptedTypes
755 paramList->set(paramName, value, docString, paramEntryValidator);
760 std::string
const& paramName,
761 long long const value, std::string
const& docString,
762 ParameterList *paramList,
763 AnyNumberParameterEntryValidator::AcceptedTypes
const& acceptedTypes
767 const RCP<const ParameterEntryValidator> paramEntryValidator =
769 AnyNumberParameterEntryValidator::PREFER_LONG_LONG, acceptedTypes
771 paramList->set(paramName, value, docString, paramEntryValidator);
776 std::string
const& paramName,
777 double const& value, std::string
const& docString,
778 ParameterList *paramList,
779 AnyNumberParameterEntryValidator::AcceptedTypes
const& acceptedTypes
783 const RCP<const ParameterEntryValidator> paramEntryValidator =
785 AnyNumberParameterEntryValidator::PREFER_DOUBLE, acceptedTypes
787 paramList->set(paramName, value, docString, paramEntryValidator);
792 std::string
const& paramName,
793 std::string
const& value, std::string
const& docString,
794 ParameterList *paramList,
795 AnyNumberParameterEntryValidator::AcceptedTypes
const& acceptedTypes
799 const RCP<const ParameterEntryValidator> paramEntryValidator =
801 AnyNumberParameterEntryValidator::PREFER_STRING, acceptedTypes
803 paramList->set(paramName, value, docString, paramEntryValidator);
808 ParameterList
const& paramList,
809 std::string
const& paramName
812 const ParameterEntry &entry = paramList.getEntry(paramName);
813 RCP<const AnyNumberParameterEntryValidator>
814 anyNumValidator = rcp_dynamic_cast<const AnyNumberParameterEntryValidator>(
817 if ( !
is_null(anyNumValidator) )
818 return anyNumValidator->getInt(entry,paramName,paramList.name());
819 if (
typeid(
int) == entry.getAny().type() )
820 return any_cast<int>(entry.getAny());
822 const AnyNumberParameterEntryValidator myAnyNumValidator;
823 return myAnyNumValidator.getInt(entry,paramName,paramList.name());
828 ParameterList
const& paramList,
829 std::string
const& paramName
832 const ParameterEntry &entry = paramList.getEntry(paramName);
833 RCP<const AnyNumberParameterEntryValidator>
834 anyNumValidator = rcp_dynamic_cast<const AnyNumberParameterEntryValidator>(
837 if ( !
is_null(anyNumValidator) )
838 return anyNumValidator->getLongLong(entry,paramName,paramList.name());
839 if (
typeid(
long long) == entry.getAny().type() )
840 return any_cast<long long>(entry.getAny());
842 const AnyNumberParameterEntryValidator myAnyNumValidator;
843 return myAnyNumValidator.getLongLong(entry,paramName,paramList.name());
848 ParameterList
const& paramList,
849 std::string
const& paramName
852 const ParameterEntry &entry = paramList.getEntry(paramName);
853 RCP<const AnyNumberParameterEntryValidator>
854 anyNumValidator = rcp_dynamic_cast<const AnyNumberParameterEntryValidator>(
857 if ( !
is_null(anyNumValidator) )
858 return anyNumValidator->getDouble(entry,paramName,paramList.name());
859 if (
typeid(
double) == entry.getAny().type() )
860 return any_cast<double>(entry.getAny());
862 const AnyNumberParameterEntryValidator myAnyNumValidator;
863 return myAnyNumValidator.getDouble(entry,paramName,paramList.name());
868 ParameterList
const& paramList,
869 std::string
const& paramName
872 const ParameterEntry &entry = paramList.getEntry(paramName);
873 RCP<const AnyNumberParameterEntryValidator>
874 anyNumValidator = rcp_dynamic_cast<const AnyNumberParameterEntryValidator>(
877 if ( !
is_null(anyNumValidator) )
878 return anyNumValidator->getString(entry,paramName,paramList.name());
879 if (
typeid(std::string) == entry.getAny().type() )
880 return any_cast<std::string>(entry.getAny());
882 const AnyNumberParameterEntryValidator myAnyNumValidator;
883 return myAnyNumValidator.getString(entry,paramName,paramList.name());
Definition of Teuchos::as, for conversions between types.
Determines the types that are accepted.
AcceptedTypes & allowInt(bool _allowInt)
Set allow an int value or not.
AcceptedTypes & allowLongLong(bool _allowLongLong)
Set allow an long long value or not.
const std::string getXMLTypeName() const
void validate(ParameterEntry const &entry, std::string const ¶mName, std::string const &sublistName) const
void printDoc(std::string const &docString, std::ostream &out) const
double getDouble(const ParameterEntry &entry, const std::string ¶mName="", const std::string &sublistName="", const bool activeQuery=true) const
Get a double value from a parameter entry. will call std::stod.
long long getLongLong(const ParameterEntry &entry, const std::string ¶mName="", const std::string &sublistName="", const bool activeQuery=true) const
Get a long long value from a parameter entry. will call std::stoll Note that std::stoll throws on bad...
std::string getString(const ParameterEntry &entry, const std::string ¶mName="", const std::string &sublistName="", const bool activeQuery=true) const
Get a std::string value from a parameter entry.
AnyNumberParameterEntryValidator()
Construct with a preferrded type of double and accept all types.
int getInt(const ParameterEntry &entry, const std::string ¶mName="", const std::string &sublistName="", const bool activeQuery=true) const
Get an integer value from a parameter entry. will call std::stoi Note that std::stoi throws on badly ...
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT RCP< AnyNumberParameterEntryValidator > anyNumberParameterEntryValidator()
Nonmember constructor AnyNumberParameterEntryValidator.
ValidStringsList validStringValues() const
bool isLongLongAllowed() const
Lookup whether or not long longs are allowed.
void validateAndModify(std::string const ¶mName, std::string const &sublistName, ParameterEntry *entry) const
bool isStringAllowed() const
Lookup whether or not strings are allowed.
bool isDoubleAllowed() const
Lookup whether or not doubles are allowed.
EPreferredType
Determines what type is the preferred type.
EPreferredType getPreferredType() const
Lookup the preferred type.
bool isIntAllowed() const
Lookup whether or not ints are allowed.
Replacement for std::vector that is compatible with the Teuchos Memory Management classes.
std::vector< T >::const_iterator const_iterator
The type of a const forward iterator.
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT RCP< BoolParameterEntryValidator > boolParameterEntryValidator()
Nonmember constructor BoolParameterEntryValidator.
void validateAndModify(std::string const ¶mName, std::string const &sublistName, ParameterEntry *entry) const
const std::string getXMLTypeName() const
ValidStringsList validStringValues() const
void validate(ParameterEntry const &entry, std::string const ¶mName, std::string const &sublistName) const
bool getBool(const ParameterEntry &entry, const std::string ¶mName="", const std::string &sublistName="", const bool activeQuery=true) const
Get bool value from a parameter entry.
void printDoc(std::string const &docString, std::ostream &out) const
static RCP< T > getDummyObject()
Retrieves a dummy object of type T.
Validate a file name entry.
ValidStringsList validStringValues() const
const std::string getXMLTypeName() const
bool fileEmptyNameOK() const
Gets the variable describing whether or not this validator is OK with file name being empty (even if ...
void validate(ParameterEntry const &entry, std::string const ¶mName, std::string const &sublistName) const
bool setFileEmptyNameOK(bool isEmptyNameOK)
Sets whether or not the validator is OK with empty file name (even if fileMustExist() returns true).
bool fileMustExist() const
Gets the variable describing whether or not this validator wants the file that is specified to alread...
FileNameValidator(bool mustAlreadyExist=mustAlreadyExistDefault())
Constructs a FileNameValidator.
bool setFileMustExist(bool shouldFileExist)
Sets whether or not the validator requires the file to already exist.
void printDoc(std::string const &docString, std::ostream &out) const
This object is held as the "value" in the Teuchos::ParameterList std::map.
any & getAny(bool activeQry=true)
Direct access to the Teuchos::any data value underlying this object. The bool argument activeQry (def...
void setValue(T value, bool isDefault=false, const std::string &docString="", RCP< const ParameterEntryValidator > const &validator=null)
Templated set method that uses the input value type to determine the type of parameter.
T & getValue(const ParameterEntry &entry)
A templated helper function for returning the value of type T held in the ParameterEntry object,...
RCP< const Array< std::string > > ValidStringsList
ParameterEntryValidator()
Default Constructor.
A list of parameters of arbitrary type.
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT std::string getNumericStringParameter(ParameterList const ¶mList, std::string const ¶mName)
Get std::string numeric parameter.
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT void setDoubleParameter(std::string const ¶mName, double const &value, std::string const &docString, ParameterList *paramList, AnyNumberParameterEntryValidator::AcceptedTypes const &acceptedTypes=AnyNumberParameterEntryValidator::AcceptedTypes())
Set an double parameter that allows for (nearly) any input parameter type that is convertible to a do...
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT void setLongLongParameter(std::string const ¶mName, long long const value, std::string const &docString, ParameterList *paramList, AnyNumberParameterEntryValidator::AcceptedTypes const &acceptedTypes=AnyNumberParameterEntryValidator::AcceptedTypes())
Set an integer parameter that allows for (nearly) any input parameter type that is convertible to an ...
const std::string & name() const
The name of this ParameterList.
ParameterEntry * getEntryPtr(const std::string &name)
Retrieves the pointer for an entry with the name name if it exists.
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT double getDoubleParameter(ParameterList const ¶mList, std::string const ¶mName)
Get double integer parameter.
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT void setIntParameter(std::string const ¶mName, int const value, std::string const &docString, ParameterList *paramList, AnyNumberParameterEntryValidator::AcceptedTypes const &acceptedTypes=AnyNumberParameterEntryValidator::AcceptedTypes())
Set an integer parameter that allows for (nearly) any input parameter type that is convertible to an ...
T & get(const std::string &name, T def_value)
Return the parameter's value, or the default value if it is not there.
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT void setNumericStringParameter(std::string const ¶mName, std::string const &value, std::string const &docString, ParameterList *paramList, AnyNumberParameterEntryValidator::AcceptedTypes const &acceptedTypes=AnyNumberParameterEntryValidator::AcceptedTypes())
Set an numeric parameter preferred as a std::string that allows for (nearly) any input parameter type...
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT long long getLongLongParameter(ParameterList const ¶mList, std::string const ¶mName)
Get a long long parameter.
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT int getIntParameter(ParameterList const ¶mList, std::string const ¶mName)
Get an integer parameter.
Smart reference counting pointer class for automatic garbage collection.
static std::ostream & printLines(std::ostream &os, const std::string &linePrefix, const std::string &lines)
Print lines with prefix first.
Standard implementation of a ParameterEntryValidator that maps from a list of strings to an enum or i...
A simple validator that only allows certain string values to be choosen or simply enforces that a par...
const std::string getXMLTypeName() const
void validate(ParameterEntry const &entry, std::string const ¶mName, std::string const &sublistName) const
StringValidator()
Constructs a StringValidator.
void printDoc(std::string const &docString, std::ostream &out) const
ValidStringsList validStringValues() const
ValidStringsList setValidStrings(const Teuchos::Array< std::string > &validStrings)
Sets the Array of valid strings and returns what the current array of valid string now is.
Tuple< T, 1 > tuple(const T &a)
Create a Tuple<T,1>.
static std::string name()
static std::string toString(const double &x)
Write a double as a std::string.
Modified boost::any class, which is a container for a templated value.
ValueType & any_cast(any &operand)
Used to extract the templated value held in Teuchos::any to a given value type.
std::string typeName() const
Return the name of the type.
const std::type_info & type() const
Return the type of value being stored.
#define TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
This macro is designed to be a short version of TEUCHOS_TEST_FOR_EXCEPTION() that is easier to call.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
bool is_null(const boost::shared_ptr< T > &p)
Returns true if p.get()==NULL.
TypeTo as(const TypeFrom &t)
Convert from one value type to another.
@ VERB_MEDIUM
Generate more output.
@ VERB_HIGH
Generate a high level of output.
@ VERB_EXTREME
Generate the most output possible.
@ VERB_NONE
Generate no output.
@ VERB_DEFAULT
Generate output as defined by the object.
@ VERB_LOW
Generate only a minimal amount of output.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.