1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef SANDBOX_LINUX_BPF_DSL_CONS_H_ 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define SANDBOX_LINUX_BPF_DSL_CONS_H_ 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/ref_counted.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "sandbox/sandbox_export.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace sandbox { 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Cons provides an immutable linked list abstraction as commonly 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// provided in functional programming languages like Lisp or Haskell. 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochtemplate <typename T> 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass Cons : public base::RefCounted<Cons<T> > { 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // List provides an abstraction for referencing a list of zero or 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // more Cons nodes. 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef scoped_refptr<const Cons<T> > List; 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Return this node's head element. 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const T& head() const { return head_; } 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Return this node's tail element. 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch List tail() const { return tail_; } 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Construct a new List using |head| and |tail|. 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static List Make(const T& head, List tail) { 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return make_scoped_refptr(new const Cons<T>(head, tail)); 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Cons(const T& head, List tail) : head_(head), tail_(tail) {} 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~Cons() {} 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch T head_; 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch List tail_; 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch friend class base::RefCounted<Cons<T> >; 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(Cons); 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace sandbox 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif // SANDBOX_LINUX_BPF_DSL_CONS_H_ 47