ENH: add standard _byte access for exprValue
- allows UPstream::broadcast and direct read/write - add operator== for exprValue
This commit is contained in:
parent
24188d70a6
commit
636a654f4a
@ -1,3 +1,3 @@
|
|||||||
Test-exprValue.C
|
Test-exprValue.cxx
|
||||||
|
|
||||||
EXE = $(FOAM_USER_APPBIN)/Test-exprValue
|
EXE = $(FOAM_USER_APPBIN)/Test-exprValue
|
||||||
|
@ -22,12 +22,13 @@ Description
|
|||||||
#include "IOstreams.H"
|
#include "IOstreams.H"
|
||||||
#include "ITstream.H"
|
#include "ITstream.H"
|
||||||
#include "exprValue.H"
|
#include "exprValue.H"
|
||||||
|
#include "Pstream.H"
|
||||||
|
|
||||||
using namespace Foam;
|
using namespace Foam;
|
||||||
|
|
||||||
void printInfo(const expressions::exprValue& val)
|
void printInfo(const expressions::exprValue& val)
|
||||||
{
|
{
|
||||||
Info<< "Boxed type:" << int(val.typeCode())
|
Pout<< "Boxed type:" << int(val.typeCode())
|
||||||
<< " (" << val.valueTypeName() << ") good:"
|
<< " (" << val.valueTypeName() << ") good:"
|
||||||
<< val.good() << " => " << val << nl;
|
<< val.good() << " => " << val << nl;
|
||||||
}
|
}
|
||||||
@ -74,16 +75,28 @@ expressions::exprValue tryParse(const std::string& str)
|
|||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
argList::noBanner();
|
argList::noBanner();
|
||||||
argList::noParallel();
|
argList::noCheckProcessorDirectories();
|
||||||
|
|
||||||
#include "setRootCase.H"
|
#include "setRootCase.H"
|
||||||
|
|
||||||
// Aborts
|
// Aborts
|
||||||
// expressions::exprValue value(std::string(""));
|
// expressions::exprValue value(std::string(""));
|
||||||
|
|
||||||
|
// Regular broadcast doesn't work
|
||||||
|
Info<< "exprValue"
|
||||||
|
<< " sizeof:" << sizeof(expressions::exprValue)
|
||||||
|
<< " contiguous:" << is_contiguous<expressions::exprValue>::value
|
||||||
|
<< nl << nl;
|
||||||
|
|
||||||
{
|
{
|
||||||
expressions::exprValue value;
|
expressions::exprValue value;
|
||||||
|
|
||||||
|
Info<< "exprValue"
|
||||||
|
<< " sizeof:" << value.size_bytes()
|
||||||
|
<< nl << nl;
|
||||||
|
|
||||||
|
// Info<< "value: " << value << nl;
|
||||||
|
|
||||||
// Nothing
|
// Nothing
|
||||||
printInfo(value);
|
printInfo(value);
|
||||||
|
|
||||||
@ -102,8 +115,47 @@ int main(int argc, char *argv[])
|
|||||||
value.clear();
|
value.clear();
|
||||||
printInfo(value);
|
printInfo(value);
|
||||||
|
|
||||||
value = 100 * vector(1,0,0);
|
if (UPstream::parRun())
|
||||||
|
{
|
||||||
|
Info<< "Before broadcast" << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UPstream::master())
|
||||||
|
{
|
||||||
|
value = 100 * vector(1,0,0);
|
||||||
|
}
|
||||||
printInfo(value);
|
printInfo(value);
|
||||||
|
|
||||||
|
expressions::exprValue oldValue(value);
|
||||||
|
|
||||||
|
// Since the IO serialization is not symmetric (in ASCII) there
|
||||||
|
// is no 'operator>>' defined and thus the regular Pstream::broadcast
|
||||||
|
// will not compile.
|
||||||
|
// Even although the data are contiguous and that code branch is never
|
||||||
|
// used.
|
||||||
|
|
||||||
|
// Fails to compile: Pstream::broadcast(value);
|
||||||
|
|
||||||
|
// Broadcast manually
|
||||||
|
UPstream::broadcast
|
||||||
|
(
|
||||||
|
value.data_bytes(),
|
||||||
|
value.size_bytes(),
|
||||||
|
UPstream::worldComm
|
||||||
|
);
|
||||||
|
|
||||||
|
Pout<< "same values: " << (oldValue == value) << nl;
|
||||||
|
|
||||||
|
// Can put them in a Map and write, but reading will not work...
|
||||||
|
Map<expressions::exprValue> map;
|
||||||
|
map(1) = value;
|
||||||
|
Info<< "map: " << map << nl;
|
||||||
|
|
||||||
|
if (UPstream::parRun())
|
||||||
|
{
|
||||||
|
Info<< "After broadcast" << nl;
|
||||||
|
printInfo(value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -300,6 +300,51 @@ bool Foam::expressions::exprValue::read(ITstream& is)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
bool Foam::expressions::exprValue::operator==(const exprValue& rhs) const
|
||||||
|
{
|
||||||
|
if (typeCode_ != rhs.typeCode_)
|
||||||
|
{
|
||||||
|
// Types must match
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (this == &rhs)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (typeCode_)
|
||||||
|
{
|
||||||
|
#undef doLocalCode
|
||||||
|
#define doLocalCode(Type, UnusedParam) \
|
||||||
|
\
|
||||||
|
case expressions::valueTypeCode::type_##Type : \
|
||||||
|
{ \
|
||||||
|
const Type* a = data_.get<Type>(); \
|
||||||
|
const Type* b = rhs.data_.get<Type>(); \
|
||||||
|
return (a && b && (*a == *b)); \
|
||||||
|
break; \
|
||||||
|
}
|
||||||
|
|
||||||
|
FOR_ALL_EXPR_VALUE_TYPES(doLocalCode);
|
||||||
|
#undef doLocalCode
|
||||||
|
|
||||||
|
// exprValue may only be a subset of valueTypeCode types
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::expressions::exprValue::operator<(const exprValue& rhs) const
|
||||||
|
{
|
||||||
|
// Not yet sortable
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::Ostream& Foam::operator<<
|
Foam::Ostream& Foam::operator<<
|
||||||
|
@ -44,13 +44,14 @@ SourceFiles
|
|||||||
|
|
||||||
#include "exprTraits.H"
|
#include "exprTraits.H"
|
||||||
#include "error.H"
|
#include "error.H"
|
||||||
|
#include "contiguous.H"
|
||||||
#include "tokenList.H"
|
#include "tokenList.H"
|
||||||
#include "InfoProxy.H"
|
#include "InfoProxy.H"
|
||||||
#include <typeinfo>
|
#include <typeinfo>
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
// Execute macro for known exprValue types, with more probably ones first
|
// Execute macro for known exprValue types, with more frequent ones first
|
||||||
#undef FOR_ALL_EXPR_VALUE_TYPES
|
#undef FOR_ALL_EXPR_VALUE_TYPES
|
||||||
#define FOR_ALL_EXPR_VALUE_TYPES(Macro, ...) \
|
#define FOR_ALL_EXPR_VALUE_TYPES(Macro, ...) \
|
||||||
Macro(scalar, __VA_ARGS__) \
|
Macro(scalar, __VA_ARGS__) \
|
||||||
@ -306,6 +307,40 @@ public:
|
|||||||
void operator=(const Foam::zero) { fill_zero(); }
|
void operator=(const Foam::zero) { fill_zero(); }
|
||||||
|
|
||||||
|
|
||||||
|
// Low-level access
|
||||||
|
|
||||||
|
//- Pointer to the data content as byte data
|
||||||
|
const char* cdata_bytes() const noexcept
|
||||||
|
{
|
||||||
|
return reinterpret_cast<const char*>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Pointer to the data content as byte data
|
||||||
|
char* data_bytes() noexcept
|
||||||
|
{
|
||||||
|
return reinterpret_cast<char*>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Size of the (contiguous) data content as byte data
|
||||||
|
//- is compile-time constant
|
||||||
|
static constexpr unsigned size_bytes() noexcept
|
||||||
|
{
|
||||||
|
return sizeof(exprValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Compare (type,value) for equality
|
||||||
|
bool operator==(const exprValue& rhs) const;
|
||||||
|
|
||||||
|
//- Compare (type,value) for inequality
|
||||||
|
bool operator!=(const exprValue& rhs) const { return !(*this == rhs); }
|
||||||
|
|
||||||
|
//- Compare (type,value) - currently not implemented.
|
||||||
|
bool operator<(const exprValue& rhs) const;
|
||||||
|
|
||||||
|
|
||||||
// Output
|
// Output
|
||||||
|
|
||||||
//- Return info proxy for printing information to a stream
|
//- Return info proxy for printing information to a stream
|
||||||
@ -323,10 +358,13 @@ public:
|
|||||||
|
|
||||||
} // End namespace expressions
|
} // End namespace expressions
|
||||||
|
|
||||||
|
//- The data content are contiguous
|
||||||
|
template<> struct is_contiguous<expressions::exprValue> : std::true_type {};
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||||
|
|
||||||
//- Write value to output stream in ASCII format
|
//- Write value to output stream in ASCII format. No output for !good().
|
||||||
Ostream& operator<<(Ostream& os, const expressions::exprValue& val);
|
Ostream& operator<<(Ostream& os, const expressions::exprValue& val);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
Loading…
Reference in New Issue
Block a user