[odb-users] Problem using <complex>

Andrew Cunningham odb at a-cunningham.com
Fri May 5 11:51:21 EDT 2023


Hi Boris,
Just following up on this issue.

Let's assume I have upgraded ODB and no longer hit the compile errors
and don't need the workaround.

Then I must admit I am struggling with the correct #pragma db pattern
to persist a 'complex' value.

We do not know the names of the private data members of 'complex' so
can only use the public member functions which are standardized across
all implementations.

I have tried the following, but I am flailing around and getting nowhere.

using FComplex=std::complex<float>;

#ifdef ODB_COMPILER
#pragma db value(FComplex) definition
#pragma db member(FComplex::real)   virtual(float) get(real) \
             set(real)   column("re")
#pragma db member(FComplex::imag)   virtual(float) get(imag) \
             set(imag) column("im")
#endif


Andrew

On Fri, May 5, 2023 at 3:50 AM Boris Kolpackov <boris at codesynthesis.com> wrote:
>
> Andrew Cunningham <odb at a-cunningham.com> writes:
>
> > Whenever I include <complex> in a header file to  be processed by ODB
> > I get many of the following types of errors. I will be making the
> > complex data member persistent.
> >
> > [...]
> >
> > I have been unable to come up with a workaround so far.
>
> If upgrading to a later version of ODB is not an option here, I would
> probably resort to emulating std::complex during the ODB compilation.
> Something along these lines:
>
> #ifndef ODB_COMPILER
> #  include <complex>
> #else
> namespace std
> {
>   template <typename T>
>   class complex
>   {
>     T re_;
>     T im_;
>
>   public:
>     using value_type = T;
>
>     complex(T re = T(), T im = T()): re_ (re), im_ (im) {}
>
>     complex(const complex&) = default;
>     complex& operator=(const complex&) = default;
>
>     T real() const {return re_;}
>     void real(T re) {re_ = re;}
>     T imag() const {return im_;}
>     void imag(T im) {im_ = im;};
>   };
> }
> #endif
>
> You may also need to #ifdef-out any inline code that requires a proper
> definition std::complex based on the ODB_COMPILER macro.



More information about the odb-users mailing list