[esnacc-dev] [PATCH v2] iomanip: Add an IO Manipulator for C++

Aaron Conole aconole at bytheb.org
Fri Sep 23 21:10:03 UTC 2016


Aaron Conole <aconole at bytheb.org> writes:

> This patch starts on a series adding IO Manipulators for C++ support.
> Currently, Print(), and BEnc() are supported.  A future commit will add
> support for input streams.
>
> As new Encode/Decode rules are added, it is expected that additional
> manipulators will be created to make convenient IO routines.
>
> Signed-off-by: Aaron Conole <aconole at bytheb.org>
> ---
>  cxx-examples/src/automatic.cpp |  8 +++++--
>  cxx-lib/inc/asn-incl.h         | 13 ++++++-----
>  cxx-lib/inc/asn-iomanip.h      | 52 ++++++++++++++++++++++++++++++++++++++++++
>  cxx-lib/src/print.cpp          | 21 +++++++++++++++--
>  4 files changed, 84 insertions(+), 10 deletions(-)
>  create mode 100644 cxx-lib/inc/asn-iomanip.h
>

I need to add the following incremental for 'make distcheck' to
proceed.  It will be included in a v3 spin, but I'm going to let it sit
for a week to bake.

diff --git a/cxx-lib/automake.mk b/cxx-lib/automake.mk
index f8d6252..249f2dc 100644
--- a/cxx-lib/automake.mk
+++ b/cxx-lib/automake.mk
@@ -4,6 +4,7 @@ nobase_include_HEADERS += cxx-lib/inc/asn-buf.h \
        cxx-lib/inc/asn-chartraits.h \
        cxx-lib/inc/asn-config.h \
        cxx-lib/inc/asn-incl.h \
+       cxx-lib/inc/asn-iomanip.h \
        cxx-lib/inc/asn-list.h \
        cxx-lib/inc/asn-listset.h \
        cxx-lib/inc/asn-usefultypes.h \


> diff --git a/cxx-examples/src/automatic.cpp b/cxx-examples/src/automatic.cpp
> index b35f5aa..7c08b91 100644
> --- a/cxx-examples/src/automatic.cpp
> +++ b/cxx-examples/src/automatic.cpp
> @@ -1,4 +1,5 @@
>  #include "autotags.h"
> +#include <sstream>
>  
>  static SNACC::Human *
>  getHuman(const char *name, int age, bool isBiblical,
> @@ -102,10 +103,13 @@ int automaticTests()
>              return 1;
>          }
>  
> -        SNACC::AsnBuf benc;
>          SNACC::AsnBuf expected((const char *)(t[i].bytes), t[i].byte_len);
>          try {
> -            h.BEnc(benc);
> +            std::stringstream s;
> +            s << SNACC::EncodeBER;
> +            s << h;
> +            SNACC::AsnBuf benc(s.str().c_str(), s.str().length());
> +
>              if (!(benc == expected)) {
>                  fail_enc = true;
>              }
> diff --git a/cxx-lib/inc/asn-incl.h b/cxx-lib/inc/asn-incl.h
> index ebd04ee..7270f28 100644
> --- a/cxx-lib/inc/asn-incl.h
> +++ b/cxx-lib/inc/asn-incl.h
> @@ -1404,18 +1404,19 @@ extern "C" {
>  void SNACCDLL_API SNACC_CleanupMemory();
>  }
>  
> -
>  //########################################################################
>  //########################################################################
>  
> -_END_SNACC_NAMESPACE
> -
>  
> -// Overload of operator<< to stream out an AsnType
> -SNACCDLL_API std::ostream& operator<<(std::ostream& os,
> -									  const SNACC::AsnType& a);
> +enum SNACCEncodeDecodeRules {
> +    SNACC_ASCII,
> +    BER,
> +    PER
> +};
>  
> +_END_SNACC_NAMESPACE
>  
> +#include "asn-iomanip.h"
>  #include "snaccexcept.h"
>  #include "asn-usefultypes.h"
>  
> diff --git a/cxx-lib/inc/asn-iomanip.h b/cxx-lib/inc/asn-iomanip.h
> new file mode 100644
> index 0000000..172e7ed
> --- /dev/null
> +++ b/cxx-lib/inc/asn-iomanip.h
> @@ -0,0 +1,52 @@
> +#ifndef __ASN_IOMANIP_H__
> +#define __ASN_IOMANIP_H__
> +
> +_BEGIN_SNACC_NAMESPACE
> +
> +inline int SNACCDLL_API
> +getSNACCEncoderIOSType()
> +{
> +    static int iDelimIdx = std::ios_base::xalloc();
> +    return iDelimIdx;
> +}
> +
> +static inline std::ios_base& SNACCDLL_API
> +SNACC_setiosencodetype(std::ios_base &s, SNACCEncodeDecodeRules t)
> +{
> +    s.iword(getSNACCEncoderIOSType()) = (int)t;
> +    return s;
> +}
> +
> +static inline SNACCEncodeDecodeRules SNACCDLL_API
> +SNACC_getiosencodetype(std::ios_base &s)
> +{
> +    return (SNACCEncodeDecodeRules)s.iword(getSNACCEncoderIOSType());
> +}
> +
> +static inline
> +std::ios_base & SNACCDLL_API EncodeBER(std::ios_base &s)
> +{
> +    return SNACC_setiosencodetype(s, BER);
> +}
> +
> +static inline
> +std::ios_base & SNACCDLL_API EncodeNORMAL(std::ios_base &s)
> +{
> +    return SNACC_setiosencodetype(s, SNACC_ASCII);
> +}
> +
> +static inline
> +std::ios_base & SNACCDLL_API EncodePER(std::ios_base &s)
> +{
> +    return SNACC_setiosencodetype(s, PER);
> +}
> +
> +_END_SNACC_NAMESPACE
> +
> +// Overload of operator<< to stream out an AsnType
> +std::ostream& SNACCDLL_API operator<<(std::ostream& os,
> +                                      const SNACC::AsnType& a);
> +
> +
> +
> +#endif
> diff --git a/cxx-lib/src/print.cpp b/cxx-lib/src/print.cpp
> index e19b54f..075049d 100644
> --- a/cxx-lib/src/print.cpp
> +++ b/cxx-lib/src/print.cpp
> @@ -17,7 +17,7 @@
>  //
>  
>  #include "asn-incl.h"
> -
> +#include "asn-iomanip.h"
>  
>  void SNACC::Indent(std::ostream& os, unsigned short i)
>  {
> @@ -27,6 +27,23 @@ void SNACC::Indent(std::ostream& os, unsigned short i)
>  
>  std::ostream& operator<<(std::ostream& os, const SNACC::AsnType& v)
>  {
> -	v.Print(os);
> +    switch(SNACC::SNACC_getiosencodetype(os)) {
> +    default:
> +    case SNACC::SNACC_ASCII:
> +        v.Print(os);
> +        break;
> +    case SNACC::BER:
> +        {
> +            SNACC::AsnBuf b(os.rdbuf());
> +            b.ResetMode(std::ios_base::out);
> +            v.BEnc(b);
> +        }
> +        break;
> +    case SNACC::PER:
> +        throw SNACC::SnaccException(__FILE__, __LINE__,
> +                                    "operator<<",
> +                                    "No Proper PER Support at this time");
> +        break;
> +    }
>  	return os;
>  }



More information about the dev mailing list