[llvm] r194655 - Add dyn_cast<> support to YAML I/O's IO class
Sean Silva
silvas at purdue.edu
Wed Nov 13 19:30:13 PST 2013
Out of curiousity what is use case for this? One of the things I like about
YAMLIO is that both input and output "work from a single point of truth";
being able to distinguish when we are inputting from when we are outputting
seems like it could be problematic as it circumvents that property of the
interface.
-- Sean Silva
On Wed, Nov 13, 2013 at 9:38 PM, Nick Kledzik <kledzik at apple.com> wrote:
> Author: kledzik
> Date: Wed Nov 13 20:38:07 2013
> New Revision: 194655
>
> URL: http://llvm.org/viewvc/llvm-project?rev=194655&view=rev
> Log:
> Add dyn_cast<> support to YAML I/O's IO class
>
> Modified:
> llvm/trunk/include/llvm/Support/YAMLTraits.h
> llvm/trunk/lib/Support/YAMLTraits.cpp
> llvm/trunk/unittests/Support/YAMLIOTest.cpp
>
> Modified: llvm/trunk/include/llvm/Support/YAMLTraits.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/YAMLTraits.h?rev=194655&r1=194654&r2=194655&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/YAMLTraits.h (original)
> +++ llvm/trunk/include/llvm/Support/YAMLTraits.h Wed Nov 13 20:38:07 2013
> @@ -18,6 +18,7 @@
> #include "llvm/ADT/StringRef.h"
> #include "llvm/ADT/StringSwitch.h"
> #include "llvm/ADT/Twine.h"
> +#include "llvm/Support/Casting.h"
> #include "llvm/Support/Compiler.h"
> #include "llvm/Support/SourceMgr.h"
> #include "llvm/Support/YAMLParser.h"
> @@ -317,7 +318,7 @@ public:
> IO(void *Ctxt=NULL);
> virtual ~IO();
>
> - virtual bool outputting() = 0;
> + virtual bool outputting() const = 0;
>
> virtual unsigned beginSequence() = 0;
> virtual bool preflightElement(unsigned, void *&) = 0;
> @@ -694,8 +695,10 @@ public:
> // To set alternate error reporting.
> void setDiagHandler(llvm::SourceMgr::DiagHandlerTy Handler, void *Ctxt
> = 0);
>
> + static bool classof(const IO *io) { return !io->outputting(); }
> +
> private:
> - virtual bool outputting();
> + virtual bool outputting() const;
> virtual bool mapTag(StringRef, bool);
> virtual void beginMapping();
> virtual void endMapping();
> @@ -819,7 +822,9 @@ public:
> Output(llvm::raw_ostream &, void *Ctxt=NULL);
> virtual ~Output();
>
> - virtual bool outputting();
> + static bool classof(const IO *io) { return io->outputting(); }
> +
> + virtual bool outputting() const;
> virtual bool mapTag(StringRef, bool);
> virtual void beginMapping();
> virtual void endMapping();
>
> Modified: llvm/trunk/lib/Support/YAMLTraits.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/YAMLTraits.cpp?rev=194655&r1=194654&r2=194655&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/YAMLTraits.cpp (original)
> +++ llvm/trunk/lib/Support/YAMLTraits.cpp Wed Nov 13 20:38:07 2013
> @@ -59,7 +59,7 @@ void Input::setDiagHandler(SourceMgr::Di
> SrcMgr.setDiagHandler(Handler, Ctxt);
> }
>
> -bool Input::outputting() {
> +bool Input::outputting() const {
> return false;
> }
>
> @@ -382,7 +382,7 @@ Output::Output(raw_ostream &yout, void *
> Output::~Output() {
> }
>
> -bool Output::outputting() {
> +bool Output::outputting() const {
> return true;
> }
>
>
> Modified: llvm/trunk/unittests/Support/YAMLIOTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/YAMLIOTest.cpp?rev=194655&r1=194654&r2=194655&view=diff
>
> ==============================================================================
> --- llvm/trunk/unittests/Support/YAMLIOTest.cpp (original)
> +++ llvm/trunk/unittests/Support/YAMLIOTest.cpp Wed Nov 13 20:38:07 2013
> @@ -1074,6 +1074,76 @@ TEST(YAMLIO, TestTaggedDocumentsWriteAnd
> }
>
>
>
> +//===----------------------------------------------------------------------===//
> +// Test dyn_cast<> on IO object
>
> +//===----------------------------------------------------------------------===//
> +
> +struct DynCast {
> + int value;
> +};
> +typedef std::vector<DynCast> DynCastSequence;
> +
> +LLVM_YAML_IS_SEQUENCE_VECTOR(DynCast)
> +
> +namespace llvm {
> +namespace yaml {
> + template <>
> + struct MappingTraits<DynCast> {
> + static void mapping(IO &io, DynCast& info) {
> + // Change 10 to 13 when writing yaml.
> + if (Output *output = dyn_cast<Output>(&io)) {
> + (void)output;
> + if (info.value == 10)
> + info.value = 13;
> + }
> + io.mapRequired("value", info.value);
> + // Change 20 to 23 when parsing yaml.
> + if (Input *input = dyn_cast<Input>(&io)) {
> + (void)input;
> + if (info.value == 20)
> + info.value = 23;
> + }
> + }
> + };
> +}
> +}
> +
> +//
> +// Test writing then reading back a sequence of mappings
> +//
> +TEST(YAMLIO, TestDynCast) {
> + std::string intermediate;
> + {
> + DynCast entry1;
> + entry1.value = 10;
> + DynCast entry2;
> + entry2.value = 20;
> + DynCast entry3;
> + entry3.value = 30;
> + DynCastSequence seq;
> + seq.push_back(entry1);
> + seq.push_back(entry2);
> + seq.push_back(entry3);
> +
> + llvm::raw_string_ostream ostr(intermediate);
> + Output yout(ostr);
> + yout << seq;
> + }
> +
> + {
> + Input yin(intermediate);
> + DynCastSequence seq2;
> + yin >> seq2;
> +
> + EXPECT_FALSE(yin.error());
> + EXPECT_EQ(seq2.size(), 3UL);
> + EXPECT_EQ(seq2[0].value, 13); // Verify changed to 13.
> + EXPECT_EQ(seq2[1].value, 23); // Verify changed to 23.
> + EXPECT_EQ(seq2[2].value, 30); // Verify stays same.
> + }
> +}
> +
> +
>
>
> //===----------------------------------------------------------------------===//
> // Test error handling
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131113/26deb269/attachment.html>
More information about the llvm-commits
mailing list